关于Java 8新引入语法特性的简要说明
2014-04-24 20:40
239 查看
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之后,可以简化很多设计。下面例子也会呈现这点:
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新引入语法特性的简要说明
- 关于java Struts框架简要说明
- 关于Android 添加系统级(java)服务和调用的编写实现说明
- 关于JAVA do--while的简单示例说明记录
- 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
- 关于Intel处理器架构中AVX2里Gather特性的说明
- Java安全(JCA/JSSE):Java加密框架(JCA)简要说明
- 关于java方法的重载(Overloading),覆写(Override)以及final 方法的几点说明
- Java的几大特征简要说明
- 关于压缩工具类ZipCompressor.java的说明
- 关于在基于Struts构架的Java Web项目中加入ICTCLAS分词两点说明
- 关于Java的网络通信简要介绍
- SPQuery查询语法简要说明
- 关于java中switch使用的一些说明
- 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(1)
- 关于c++/c#/java 多线程绘图问题说明
- 关于java中对象的序列化和反序列化的说明
- matlab导出jar包引入java及安装MCR流程说明
- 关于引入第三方jar包引发的java.lang.NoClassDefFoundError解决