一、函数式接口的定义
函数式接口(Functional Interface)是Java 8引入的核心概念,指仅包含一个抽象方法 的接口。这类接口可通过@FunctionalInterface注解显式声明,例如:
java
@FunctionalInterface
public interface MyFunction {
void execute(String message);
}
编译器会对带有此注解的接口进行抽象方法数量校验,若不符合要求则报错。
二、函数式接口的意义
- Lambda表达式支持
函数式接口是Lambda表达式的类型载体。例如实现Runnable接口的传统方式:
java
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("传统实现");
}
}).start();
Lambda简化后:
java
new Thread(() -> System.out.println("Lambda实现")).start();
此处Runnable接口的抽象方法run()与Lambda表达式签名匹配。
- 方法引用绑定
函数式接口支持通过::操作符绑定已有方法:
java
Consumer<String> printer = System.out::println;
printer.accept("方法引用示例");
三、Java内置核心函数式接口
Java 8在java.util.function包中提供了四大基础接口:
| 接口类型 | 抽象方法 | 典型应用场景 |
|---|---|---|
Consumer<T> |
void accept(T t) |
参数消费(如打印) |
Supplier<T> |
T get() |
数据提供(如工厂) |
Function<T,R> |
R apply(T t) |
数据转换(如映射) |
Predicate<T> |
boolean test(T t) |
条件判断(如过滤) |
示例:使用Predicate过滤集合
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0) // Predicate实现
.collect(Collectors.toList());
四、自定义函数式接口实践
- 定义接口
java
@FunctionalInterface
interface StringProcessor {
String process(String input);
}
- Lambda实现
java
StringProcessor toUpper = s -> s.toUpperCase();
System.out.println(toUpper.process("hello")); // 输出"HELLO"
五、技术要点总结
- 函数式接口是Java函数式编程的基石,支持Lambda和方法引用
- 内置接口覆盖了90%的常见场景,优先考虑复用
- 自定义接口需严格遵循单抽象方法原则
- 结合Stream API可实现声明式数据处理
注 :Java 8允许函数式接口包含
default方法和static方法,这些不影响其作为函数式接口的特性。