在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
- …
所以,总结一下,定义一个函数式接口只需要满足以下两个条件:
- 只包含一个抽象方法
- 可以使用@FunctionalInterface注解(可选)