Appearance
什么是函数式接口? --答:有且仅有一个抽象函数的接口,当然了,可以有 私有方法 静态方法等。其中最为重要的便是注解@functionalInterface
它用于检查是否是函数式接口,接下来我们来看一下自定义函数式接口是如何使用的吧。
TIP
jdk自带的一些常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解。
说明
- 该注解只能标记在"有且仅有一个抽象方法"的接口上。
- JDK8接口中的静态方法和默认方法,都不算是抽象方法。
- 接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
- 该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。
- 为了规范,建议给所有需要使用函数式编程的接口都加上注解。
解析
1、只有一个抽象方法的情况
java
@FunctionalInterface
public interface MyInterface {
int test(int i);
}
2、有多个方法,但只有一个抽象方法,其他方法有默认实现
java
@FunctionalInterface
public interface MyInterface {
int test(int i);
default int add(int a, int b) {
return a + b;
}
default void sum(int a, int b) {
System.out.println("sum:" + a + b);
}
}
使用
为了方便理解,我们使用一下,看看效果
java
public static void main(String[] args) {
// 使用lombda实现test方法
MyInterface myInterface = i -> i*2;
// 调用刚刚实现的方法
System.out.println(myInterface.test(22));
// 调用默认重写的方法
System.out.println(myInterface.add(10,20));
myInterface.sum(100,20);
}
结果
shell
44
30
sum:10020