「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
函数式接口
有且仅有一个抽象方法,可以有多个非抽象方法的接口
函数式接口可以隐式转换为lambda表达式.
例如Runnable 接口就是函数式接口,只有一个抽象方法
@FunctionalIntegerface
专门为创建函数式接口的注解.用来指定某个接口必须是函数式接口,只能修饰接口
作用:告诉编译器检查这个接口,保证接口只能包含一个抽象方法
// 检查是否为函数式接口(有且只有一个抽象方法)
@FunctionalInterface
public interface hssInterface {
public abstract void test();
}
如下图,没有抽象方法时会报错,多个抽象方法也会报错.
接口的默认方法也是抽象方法 .此时有一个普通方法和被抽象修饰的方法,也报错了,说明有多个抽象方法
如何使用函数式写法
分析语法
// 通常写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("1.7");
}
}).start();
// 使用函数式写法
new Thread(() -> {System.out.println("1.8");}).start();
分析上段代码,由于Runnable 接口是函数式接口(只有一个抽象方法),因此使用new Runnable() 是相当于直接重写它的抽象方法.因此可以直接使用()代替那个抽象方法(如果有参数,还是要参数对应).
new Runnable() {
@Override
public void run() {}
// 可以直接写成下面
// 如果run方法有参数,那么在下面的()中相对应即可.
() -> {}
自己模拟
1.定义一个函数式接口
@FunctionalInterface
public interface hssInterface {
public abstract void test();
}
2.将函数式接口作为参数带入方法
public class hssClass {
// 将函数式接口作为参数
public hssClass(hssInterface hss) {
hss.test();
}
}
3.调用该方法
方法表达流程:hssClass构造方法→hssInterface函数式接口→实现唯一的抽象方法test()
//直接使用函数式接口成为变量
hssInterface hssInterface = ()->{
System.out.println();
};
// 之前的写法
new hssClass(new hssInterface() {
@Override
public void test() {
System.out.println("自己尝试函数式编程");
}
});
// 函数式接口写法
new hssClass(() -> {
System.out.println("自己尝试函数式编程");
});