什么是函数式接口,有什么作用?
一个接口有且只有一个抽象方法。这里需要注意的是,一个接口并不是真正意义上的只有一个抽象方法,(因为接口某种程度上也可说是一种类因此,它也继承object类。)比如,点开Compare接口,就会发现其中不只一个方法,如equals方法,但它是继承了Object类的equals方法,因此不列入范围。在Compare接口中还有很多的默认方法,默认default方法不列入抽象方法,比如,如果在一个方法前加上defaut和abstract会报错,因此,个人感觉函数式接口就是在实现的时候,必须要重写的方法只有一个的接口
说到函数式接口,不得不提函数式编程。它是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。历史上研究函数式编程的理论是Lambda演算,所以我们经常把支持函数式编程的编码风格称为Lambda表达式
因此函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建。
Lamda表达式的使用
举个例子
开辟线程的时候,我们常常会做如下操作
使用一个匿名内部类来节省实现Runnale接口的时间,但发现这样做还是不够简介,因为匿名内部类省略了实现类的名字,但对于函数式接口来说,要实现的方法是唯一的,那能不能省略方法名字呢,Lambda表达式就能实现上述功能。
这里可以看到,lambda表达式大大的简化了匿名内部类,但能不能更加的简化代码呢?如下图
这样就引出了本次的重点。
方法引用的具体用法
方法引用,是指如果某个方法签名和接口恰好一致,就可以直接传入方法引用,再举个例子。
可以看到静态方法的引用,就是ClassName::methodName就像ClassName.methodName()作为Test1的实现。值得一提的是构造函数使用方法引用的时候,使用的是ClassName::new;