lambda表达式由参数,箭头和主体组成
(Integer a,Integer b) -> a.comparaTo(b)
参数 箭头 主体
参数中的类型Integer可以不写,编译器可以从上下文推断出来
表达式可以用在函数式接口中,比如上面的lambda就是一个比较器:
public interface Comparator<T>{
int compare(T t1,T t2);
}
可以做为一个Comparator传递。所谓函数式接口,从定义上来说就是一个只定义了一个抽象方法的接口,在jdk1.8以后这样的函数式接口经常会看到打上了@FunctionalInterface注解,这个注解用来表示该接口会被定义成为一个函数式接口。如果你用了这个注解标注一个接口,而它却不是被设计成为函数式接口的话,编译器会返回错误。但是这个注解也不是必须的,只是作为检查。
函数式接口的抽象方法的签名基本上就是lambda表达式的签名,我们将这种抽象方法叫做函数描述符
编译器会对lambda表达式做在给定的上下文做类型检查,只有签名符合的才能编译通过。
lambda的类型是从使用lambda的上下文推断出来的,上下文中lambda表达式的类型称为目标类型。下面的例子概述了类型检查的过程。

网友评论