函数式接口、Lambda表达式、方法引用详解

什么是函数式接口,有什么作用?

    一个接口有且只有一个抽象方法。这里需要注意的是,一个接口并不是真正意义上的只有一个抽象方法,(因为接口某种程度上也可说是一种类因此,它也继承object类。)比如,点开Compare接口,就会发现其中不只一个方法,如equals方法,但它是继承了Object类的equals方法,因此不列入范围。在Compare接口中还有很多的默认方法,默认default方法不列入抽象方法,比如,如果在一个方法前加上defaut和abstract会报错,因此,个人感觉函数式接口就是在实现的时候,必须要重写的方法只有一个的接口

    说到函数式接口,不得不提函数式编程。它是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。历史上研究函数式编程的理论是Lambda演算,所以我们经常把支持函数式编程的编码风格称为Lambda表达式

    因此函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建。

Lamda表达式的使用

    举个例子

  开辟线程的时候,我们常常会做如下操作


    使用一个匿名内部类来节省实现Runnale接口的时间,但发现这样做还是不够简介,因为匿名内部类省略了实现类的名字,但对于函数式接口来说,要实现的方法是唯一的,那能不能省略方法名字呢,Lambda表达式就能实现上述功能。


        这里可以看到,lambda表达式大大的简化了匿名内部类,但能不能更加的简化代码呢?如下图


        这样就引出了本次的重点。

方法引用的具体用法

        方法引用,是指如果某个方法签名和接口恰好一致,就可以直接传入方法引用,再举个例子。



    可以看到静态方法的引用,就是ClassName::methodName就像ClassName.methodName()作为Test1的实现。值得一提的是构造函数使用方法引用的时候,使用的是ClassName::new;

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