Skip to content

什么是函数式接口? --答:有且仅有一个抽象函数的接口,当然了,可以有 私有方法 静态方法等。其中最为重要的便是注解@functionalInterface它用于检查是否是函数式接口,接下来我们来看一下自定义函数式接口是如何使用的吧。

TIP

jdk自带的一些常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解。

image-20210717102035113

说明

  1. 该注解只能标记在"有且仅有一个抽象方法"的接口上。
  2. JDK8接口中的静态方法和默认方法,都不算是抽象方法。
  3. 接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
  4. 该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。
  5. 为了规范,建议给所有需要使用函数式编程的接口都加上注解。

解析

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