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 ()