Lamda的深入认知(二)

分析一次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);
    }
}

一、编译器的静态检查工作:

  1. 编译器检查method1的重载方法,是否有符合此签名的。
  2. 此时除了(1)常规重载检查外(类型,数量,顺序),对于“函数式接口”类型的检查,将会对(2)接口中的方法的形式参数的(类型,数量,顺序)与lamda中的实参进行比对,如果符合,则命中该method1方法。
  3. 上面(2)中的检查,可以使用自动型别推断,即也可以使用以下形式。
    public static void main(String... args) {
        //自动型别推断
        method1((obj,str)->true);
    }
  1. 总结:lamda的形式参数在两处使用:一是在函数定义期,二是在方法调用语法的形参列表处用于重载方法的静态绑定,即同一方法名的多个方法,依赖lamda中的形参来区分是绑定到哪一方法上。

二、执行期的工作:

  1. method1的调用,将会按照实际对象的类型进行绑定(动态绑定到某一个实际对象的method1方法上,这不同于编译期的检查工作)

  2. 当绑定到具体对象的method1方法时,此时就会根据lamda生成匿名类的实例,并传入到method1中。

  3. method1将获取接口类型的引用,并在方法内部调用Lamda引用的对象,同时传入实参。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,540评论 1 51
  • 3. 类设计者工具 3.1 拷贝控制 五种函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数拷贝和移...
    王侦阅读 1,879评论 0 1
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,664评论 0 5
  • 注:都是在百度搜索整理的答案,如有侵权和错误,希告知更改。 一、哪些情况下的对象会被垃圾回收机制处理掉  当对象对...
    Jenchar阅读 3,245评论 3 2