- 类型检查
- 类型推断
- 局部变量限制
一、类型检查
1.1目标类型
Lambda表达式的类型是从上下文中推断出来的,为目标类型
通过流程图我们可以得出:
通过上下文找出实际需要的目标类型(哪个函数式接口),然后根据抽象方法的函数描述符和我们给定的Lambda表达式的签名进行校验,从而检查出Lambda的类型是否无误
注意:如果Lambda抛出一个异常,那么抽象方法所声明的throws语句也必须与之匹配
2.2 void兼容规则
如果Lambda表达式的主体只有一条语句,它就和返回一个void的函数描述符兼容(入参需一致)
boolean add(E e);
List list = new ArrayList<>();
Predicate predicate = a -> list.add(a);
Consumer consumer = a -> list.add(a);
二、类型推断
当Lambda表达式没有显式声明参数类型,JVM编译器会通过目标类型推断入参类型
三、final局部变量
Lambda可以无限制的捕获(在主体中引用)实例变量和静态变量,但局部变量必须显式声明为final或者事实上是final。
即:存储在堆中的变量,可以无限制访问;存储在栈中的变量,只能捕获一次,即必须是显式或者隐式的final