分析一次Lamda的调用
当调用的方法实参,包含lamda时,如下:
public class Demo02 {
public static void main(String... args) {
//实参是Lamda:...此时...
method1((Object obj,String str)->true);
}
//传入Lamda
public static void method1(MyInterface myInterface){
myInterface.fn(new Object(),"abc");
}
interface MyInterface{
boolean fn(Object obj,String str);
}
}
一、编译器的静态检查工作:
- 编译器检查method1的重载方法,是否有符合此签名的。
- 此时除了(1)常规重载检查外(类型,数量,顺序),对于“函数式接口”类型的检查,将会对(2)接口中的方法的形式参数的(类型,数量,顺序)与lamda中的实参进行比对,如果符合,则命中该method1方法。
- 上面(2)中的检查,可以使用自动型别推断,即也可以使用以下形式。
public static void main(String... args) {
//自动型别推断
method1((obj,str)->true);
}
- 总结:lamda的形式参数在两处使用:一是在函数定义期,二是在方法调用语法的形参列表处用于重载方法的静态绑定,即同一方法名的多个方法,依赖lamda中的形参来区分是绑定到哪一方法上。
二、执行期的工作:
method1的调用,将会按照实际对象的类型进行绑定(动态绑定到某一个实际对象的method1方法上,这不同于编译期的检查工作)
当绑定到具体对象的method1方法时,此时就会根据lamda生成匿名类的实例,并传入到method1中。
method1将获取接口类型的引用,并在方法内部调用Lamda引用的对象,同时传入实参。