您的位置:首页 > 编程语言 > Java开发

JDK8新特性-Lambda

2016-01-15 09:39 579 查看
Funda-men-tally, a lambda expression is just ashorter way of writing an implementation of a method for laterexecution.

Lambda是延时执行的一种简短的方法实现。所谓延时,即运行时才会生成类文件,编译时并不会生成,这也是他和内部类的最大区别.



为了配合lambda,JDK8引入了一个新的定义叫做:函数式接口

所谓函数式接口:

itis an interface that requires exactly one method to be implemented in order to

satisfytherequirements of the interface. 

(1)是一个接口

(2)只有一个待实现的方法

jdk8开始,接口可以有default方法,所以,函数式接口也是可以有default方法的,

但是,只能有一个未实现的方法。

函数式接口是非常脆弱的,只要有人在接口里添加多一个方法,那么这个接口就不是函数接口了,就会导致编译失败。

Java8提供了一个特殊的注解@FunctionalInterface来克服上面提到

的脆弱性并且显示地表明函数接口的目的(java里所有现存的接口都已

经加上了@FunctionalInterface)

java.lang.Runnable和java.util.concurrent.Callable是函数接口两个最好的例子.

Lambda的基本语法:

(Type1param1, Type2 param2, ..., TypeNparamN)->{

    statment1; 

    statment2; 

    //............. 

    returnstatmentM; 

}

JVM会根据lambda的上下文推断出具体是某个接口,再去调用该接口的某个方法,这说的接口都是函数式接口,也就能确定唯一一个未实现的接口。

下面我们看一下Lambda的一些使用实例,一般都会结合Stream使用。

List<Person> list = new ArrayList<Person>();
list.add(new Person(12,"abc"));list.add(new Person(15,"cdf"));
list.stream().forEach(x -> System.out.println(x));
list.stream().filter(x->x.getName().contains("a")).forEach(x-> System.out.println(x));
list.stream().map(x->x.getAge()).forEach(x-> System.out.println(x));
list.stream().map(x->x.getAge()).filter(x->x>13).forEach(x-> System.out.println(x));

Jdk8在接口中增加了默认方法和静态方法两个概念。

这个两个方法必须在接口中提供方法体,这是他们于传统抽象接口最大的区别,同时,默认方法可以由接口的实现方重写。

优点:默认方法的出现,允许我们可以在现有接口中添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说,该接口的众多实现方并不需要做相应的修改。java.util.Collection中添加的额外方法就是最好的例子:stream(), parallelStream(), forEach(), removeIf()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: