函数式接口的作用
函数式接口:只有一个抽象方法的接口(可以有默认方法、静态方法),注解
@FunctionalInterface标识 核心:把函数(行为)当成数据来传递,支持 Lambda 表达式。
1. 核心作用
- 支持 Lambda 表达式 Lambda 本身没有类型,需要函数式接口作为它的目标类型。 Lambda 就是实现这个接口那唯一的抽象方法。
java
@FunctionalInterface
interface MyFunc {
void run();
}
// lambda 直接实现唯一抽象方法
MyFunc f = () -> System.out.println("hello");
f.run();
- 行为参数化(把业务逻辑当参数传) 传统写法:方法只能传对象、基本类型; 函数式接口可以把一段逻辑 / 行为作为参数传入方法,同一个方法,传入不同 lambda,执行不同逻辑。
示例:集合过滤,过滤规则作为参数
java
list.stream().filter(x -> x>10).collect(Collectors.toList());
// filter 参数就是 Predicate 函数式接口
- 简化回调、模板代码 不用写一大堆匿名内部类,替代臃肿的匿名内部类。
java
// 旧:匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("任务");
}
});
// 新:lambda,Runnable就是函数式接口
new Thread(()-> System.out.println("任务"));
2.JDK 内置四大核心函数式接口
| 接口 | 抽象方法 | 作用 |
|---|---|---|
Consumer<T> |
void accept(T t) |
消费型:接收参数,无返回值 |
Supplier<T> |
T get() |
供给型:无参数,返回数据 |
Function<T,R> |
R apply(T t) |
函数型:接收 T,返回 R,转换数据 |
Predicate<T> |
boolean test(T t) |
断言型:接收 T,返回 boolean 做判断 |
3. 补充要点
@FunctionalInterface只是校验注解,不加,只要接口只有一个抽象方法,依然是函数式接口;加上强制编译校验。- Object 类的方法(equals、toString)不算抽象方法计数。
- Stream 流式编程大量依赖函数式接口,这是它的底层基础。
4. 一句话总结
函数式接口就是给 Lambda 提供类型载体,实现行为参数化,把逻辑行为当作参数传递,简化代码,是 Stream、Lambda 的底层基础。