什么是函数式接口?如何定义函数式接口?

在Java中,函数式接口(Functional Interface)是一个只包含一个抽象方法的接口。当一个接口满足这一条件时,就可以使用Lambda表达式来创建该接口的匿名实现。
定义一个函数式接口非常简单,只需要保证接口中只有一个抽象方法即可。可以使用@FunctionalInterface注解,如果接口中有多个抽象方法,编译器会报错。
例如:

@FunctionalInterface
public interface MathOperation {
    int operate(int a, int b); 
}

MathOperation接口只有一个operate()抽象方法,所以它是一个函数式接口。我们可以使用Lambda表达式来创建它的匿名实现:

MathOperation add = (x, y) -> x + y;  

其他例子:

  • Runnable接口:只有一个run()方法,所以也是函数式接口。
Runnable runnable = () -> System.out.println("Hello");
  • Comparator接口:只有一个compare()方法,所以也是函数式接口。
Comparator<Integer> comparator = (x, y) -> { ... };  
  • ActionListener接口:只有一个actionPerformed()方法,所以也是函数式接口。
button.addActionListener(event -> { ... });

Java 8在java.util.function包下定义了许多常用的函数式接口,比如:

  • Consumer
  • Supplier
  • Function
  • Predicate

所以,总结一下,定义一个函数式接口只需要满足以下两个条件:

  1. 只包含一个抽象方法
  2. 可以使用@FunctionalInterface注解(可选)