Java 8在语法上的主要改进就是新增了Lambda Expression以及Method Reference。由于官方网站的介绍稍显罗嗦,而且例子也有些复杂。我这里将提供一些更为浅显、直观的例子来帮助大家理解Java 8新引入的语法特性。

Java 8中的Lambda Expression与C、C++都不太一样。Apple为LLVM Clang新开发了Blocks语法特性,使得GNU99标准C编译器在Clang编译器下就能使用Lambda Expression。而C++则在C++11标准中就引入了Lambda表达式。Clang为Lambda表达式定义了一种新类型——<return type> (^ <block identifier>)(<parameter list>)。这种定义方式非常类似于函数指针,而这也很明显地表达了Lambda表达式的函数调用签名。

而C++11则使用[<capture>](<parameter list>) -> { }来定义Lambda,Java 8与之相类似。不过C++11的返回类型直接就是auto,除非使用std::function,否则你无法直接捕获具体的lambda表达式类型。

而Java 8却使用了一种与众不同的方式。你可以自己定义一个接口,然后将该接口引用指向一个Lambda表达式。此接口当然也有限制,即必须是函数接口!什么是函数接口?即一个interface仅有一个抽象方法的接口称为是函数接口(functional interface)。然后,lambda表达式的实体定义为:(<参数列表>) -> { <lambda实现> }。其中参数列表需要与函数接口中那唯一的抽象方法的参数列表吻合,而返回类型则直接取该抽象方法的返回类型。另外,Java的Lambda表达式不能像C++的lambda以及Blocks那样取外部函数的局部变量的引用,使得其内部能直接修改外部函数的局部变量。不过对于final变量是能够获取的,这个跟创建匿名类对象一样。

虽然这种形式有点奇葩,但还好,不算太过麻烦。由于Java比C++或Objective-C来真心啰嗦很多。这次有了Method Reference之后,可以简化很多设计。下面例子也会呈现这点:

package src;

import java.util.ArrayList;

interface MyLambdaFunc {
public void call(int p);
} class MyClass { public static void helloStaticMehtod(int a) {
System.out.println("Static method value is: " + a);
} public void memberMethod(int a) {
System.out.println("Member method is: " + a);
} public void method1(int a) {
System.out.println("Method 1:" + (a + 1));
} public void method2(int a) {
System.out.println("Method 2: " + (a + 2));
} public void method3(int a) {
System.out.println("Method 3: " + (a + 3));
}
} public class Main { public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello, world"); // Type inference
ArrayList<String> arr = new ArrayList<>();
arr.add("hello"); // Lambda Expression test
final int a = 10; MyLambdaFunc lambda = (p) -> {
System.out.println("The value is: " + (a + p));
}; lambda.call(100);
// Method Reference test
MyLambdaFunc methodRef = MyClass::helloStaticMehtod;
methodRef.call(-100); MyClass mlc = new MyClass();
methodRef = mlc::memberMethod;
methodRef.call(-200); MyLambdaFunc methodList[] = { mlc::method1, mlc::method2, mlc::method3 };
methodList[0].call(100);
methodList[1].call(100);
methodList[2].call(100);
}
}

关于Java 8新引入语法特性的简要说明的更多相关文章

  1. 自己动手为PHP7添加新的语法特性

    好文章! nikic介绍了如何向PHP添加新的语法特性,原文写的非常精彩,具体是添加in语法功能,使最终实现: <?php $words = ['hello', 'world', 'foo', ...

  2. Java 8 被动迭代式特性介绍(转自IBM)

    编程语言一般都需要提供一种机制用来遍历软件对象的集合,现代的编程语言支持更为复杂的数据结构,如列表.集合.映射和数组.遍历能力是通过公共方法提供,而内部细节都隐藏在类的私有部分,所以程序员不需要了解其 ...

  3. Java 8新特性终极指南

    目录结构 介绍 Java语言的新特性 2.1 Lambdas表达式与Functional接口 2.2 接口的默认与静态方法 2.3 方法引用 2.4 重复注解 2.5 更好的类型推测机制 2.6 扩展 ...

  4. 深入理解JVM内幕:从基本结构到Java 7新特性

    转自:http://www.importnew.com/1486.html 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境 ...

  5. Java 8 新特性终极版

    声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

  6. Java 8新特性前瞻

    快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...

  7. 浅析Java 8新特性Lambda Expression

    什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...

  8. Java 8新特性探究(二)类型注解和重复注解

    本文将介绍java 8的第二个特性:类型注解. 注解大家都知道,从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了广泛的使用,用来简化程序中的配置.那充满争议的类型注解究竟是什 ...

  9. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

随机推荐

  1. springboot学习链接

    https://github.com/wuyouzhuguli/SpringAll

  2. 《浏览器工作原理与实践》<08>调用栈:为什么JavaScript代码会出现栈溢出?

    在上篇文章中,我们讲到了,当一段代码被执行时,JavaScript 引擎先会对其进行编译,并创建执行上下文.但是并没有明确说明到底什么样的代码才算符合规范. 那么接下来我们就来明确下,哪些情况下代码才 ...

  3. 04 Windows编程——Unicode

    VS 2017下源码 #include<stdio.h> int main() { char ASC_a = 'a'; char *ASC_str = "hello"; ...

  4. Route Loops

    当网络10.4.0.0发生故障时,RouterC检测到故障,并停止其E0接口的路由报文. 然而,路由器A和B还没有收到失败的通知. 路由器A仍然认为可以通过路由器B访问10.4.0.0.路由器A的路由 ...

  5. LeetCode--链表

    1.使用常量空间复杂度在O(n log n)时间内对链表进行排序. 思路: 因为题目要求复杂度为O(nlogn),故可以考虑归并排序的思想. 归并排序的一般步骤为: 1)将待排序数组(链表)取中点并一 ...

  6. PHP 基础知识-数组

    PHP 的数组主要分为: 索引数组 - 带有数字索引的数组 关联数组 - 带有指定键的数组 多维数组 - 包含一个或多个数组的数组   索引数组:   有两种创建索引数组的方法: 索引是自动分配的(索 ...

  7. nginx用指针的值的最后一位来判断过期事件

    nginx中,将地址的最后一位取出来,用Instace变量标识,用来判断是否连接已经被释放成为过期时间 为什么指针地址最后一位一定是0呢? 这里的内存地址,一定是内存分配器分配出来的地址,如new . ...

  8. rabbitmq可靠性

    本文翻译汇总自rabbitmq的官方文档. 翻译使用谷歌翻译后简单修改,部分内容读起来仍然比较晦涩,不过意思传达到了. 可靠性指南   本页介绍了如何使用AMQP和RabbitMQ的各种功能来实现可靠 ...

  9. linux实操_shell读取控制台输入

    基本语法: read [选项] [参数] 选项: -p 指定读取值时的提示符 -t 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了 参数: 变量:指定读取值的变量名 实例1:读 ...

  10. - The superclass "javax.servlet.http.HttpServlet" was not found on the Java

    网上有很多解决方法,如这种 下面是具体的解决方法:1.右击web工程->属性或Build Path->Java Build Path->Libraries-> Add Libr ...