通俗易懂,jdk8-@FunctionalInterface:函数式接口
定义
接口中只有 “一个” 抽象方法,该接口就可以被定义为函数式接口
自定义函数式接口:Function
public class FunctionalInterfaceTest {
interface Function {
void method1();
}
public static void main(String[] args) {
test(() -> System.out.println("方法一"));
}
public static void test(Function fuc) {
fuc.method1();
}
}
输出
方法一
添加一个默认方法和静态方法(只有一个抽象方法),可以正常编译
输出
方法一
方法二
方法三
添加第二个抽象方法method4(两个抽象方法),无法编译
@FunctionalInterface
使用该注解的接口,说明该接口是个函数式接口
注解源码,里面没有任何方法
但是可以校验接口是否函数式接口,类似@Override校验是否重写方法(此处有两个抽象方法,被检测出不是函数式接口)
深入理解
函数式接口,函数也就是方法,顾名思义就是承载方法的接口
通过一个简单的例子来理解这句话(此处用List来管理了函数式接口,当需要的使用的时候再执行)
输出,没有任何内容,说明上面打印 “方法一” 和 “方法二” 的方法没有执行。因为Function接口只是承载了这两个方法,但是没有执行方法
如果需要执行承载的方法,只需要调用接口中唯一的抽象方法就可以了
输出,可以看到承载的方法被执行了
jdk最常见的5个函数式接口(Function,Consumer,Supplier,Predicate,Runnable),5个接口最主要的区别就是入参和出参的不同
Function,通过抽象方法apply发现,接口承载的方法,需要一个入参t,承载的方法会返回一个类型为R的结果
例子
结果,param * 10 -> 10*10 = 100
Consumer,通过抽象方法accept发现,接口承载的方法,需要一个入参t,承载的方法的返回值为空
例子
结果
Supplier,通过抽象方法get发现,接口承载的方法,不需要入参,承载的方法会返回一个类型为T的结果
例子
结果
Predicate,通过抽象方法test发现,接口承载的方法,需要一个入参t,承载的方法会返回一个boolean类型的结果
例子
结果,param > 10 -> 11 >10 = true
Runnable,通过抽象方法test发现,接口承载的方法,不需要入参,承载的方法的返回值为空
例子
结果
其他常见的一些函数式接口,主要区别也是入参和出参
BiFunction
BiConsumer
BiPredicate
总结
函数式接口的核心为抽象方法,根据抽象方法可以确定承载方法的入参和出参,通过调用其抽象方法来执行承载的方法