函数式接口


在 Java 中,函数式接口(Functional Interface) 是只有 一个抽象方法 的接口,用来支持 Lambda 表达式 和 函数式编程。


✅ 一、核心定义

1
2
3
4
@FunctionalInterface
public interface 接口名 {
抽象方法();
}

@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
2
3
4
@FunctionalInterface
interface MyHandler {
void handle(String msg);
}

使用 Lambda:

1
2
MyHandler h = m -> System.out.println("处理信息: " + m); // lambda表达式实现函数式接口
h.handle("Hello World"); // 调用

✅ 五、函数式接口允许哪些方法?

✔ 允许一个抽象方法
✔ 可以有默认方法 default
✔ 可以有静态方法 static
✔ 可以继承 Object 的方法(equals、toString 等)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
@FunctionalInterface
interface Demo {
void run(); // 唯一抽象方法

default void log() {
System.out.println("默认方法");
}

static void show() {
System.out.println("静态方法");
}
}

✅ 六、常用场景

✔ Lambda 表达式

1
2
3
(参数) -> { 代码逻辑 }

Runnable r = () -> System.out.println("任务执行");

✔ Stream 中 map / filter / forEach

1
list.forEach(System.out::println); // Consumer

✔ 策略模式替代写法

1
2
3
4
5
public void process(String msg, MyHandler handler) {
handler.handle(msg);
}

process("test", msg -> System.out.println(msg.toUpperCase()));

函数式接口让行为可以作为参数传递,使代码更加简洁。


⭐ 总结一句话

函数式接口就是只有一个抽象方法的接口,用来承载 Lambda 表达式,使行为可以作为参数传递。