在 Java 中,函数式接口(Functional Interface) 是只有 一个抽象方法 的接口,用来支持 Lambda 表达式 和 函数式编程。
✅ 一、核心定义
1 |
|
✔ @FunctionalInterface 不是必须的,但加上能帮助编译器检查是否符合规范。
✔ 只允许有 一个 抽象方法(默认方法、静态方法、Object 的方法不算)。
✅ 二、为什么需要函数式接口?
因为 Java 8 的 Lambda 表达式需要一个“函数类型”的载体,而接口就是这个载体。
Lambda 本质上就是用匿名函数实例化一个函数式接口。
✅ 三、常见函数式接口举例(java.util.function 包)
| 接口 | 作用 | 方法 |
|---|---|---|
| Function<T, R> | 一个参数 → 返回结果 | apply |
| Consumer | 一个参数 → 无返回值 | accept |
| Supplier | 无参数 → 返回值 | get |
| Predicate | 一个参数 → boolean 判断 | test |
| Runnable | 无参数无返回值 | run |
| Comparator | 两个参数比较 | compare |
✅ 四、自己定义函数式接口示例
1 |
|
使用 Lambda:
1 | MyHandler h = m -> System.out.println("处理信息: " + m); // lambda表达式实现函数式接口 |
✅ 五、函数式接口允许哪些方法?
✔ 允许一个抽象方法
✔ 可以有默认方法 default
✔ 可以有静态方法 static
✔ 可以继承 Object 的方法(equals、toString 等)
示例:
1 |
|
✅ 六、常用场景
✔ Lambda 表达式
1 | (参数) -> { 代码逻辑 } |
✔ Stream 中 map / filter / forEach
1 | list.forEach(System.out::println); // Consumer |
✔ 策略模式替代写法
1 | public void process(String msg, MyHandler handler) { |
函数式接口让行为可以作为参数传递,使代码更加简洁。
⭐ 总结一句话
函数式接口就是只有一个抽象方法的接口,用来承载 Lambda 表达式,使行为可以作为参数传递。