什么是函数式接口?
函数式接口是 Java 8 中支持函数式编程的核心概念,定义为 “有且仅有一个抽象方法的接口”(可包含静态方法和默认方法),具体特性如下:
# 1. 核心定义与注解
- 必须满足:接口中只有一个抽象方法(
abstract修饰,可省略); - 可选注解:
@FunctionalInterface(用于编译时校验,若不符合函数式接口定义,编译报错); - 允许包含:静态方法(
static)、默认方法(default)、Object类的方法(如equals、toString),这些不视为抽象方法。
# 2. 核心作用
- 作为 Lambda 表达式的 “目标类型”:Lambda 表达式只能赋值给函数式接口(如
Runnable run = () -> System.out.println("run")); - 作为方法参数:支持将 Lambda 表达式传入接收函数式接口的方法(如
Collections.sort(list, (a,b) -> a.compareTo(b)))。
# 3. 常见内置函数式接口
Java 8java.util.function包提供了常用函数式接口,避免重复定义:
Predicate<T>:接收 T,返回 boolean(断言);Consumer<T>:接收 T,无返回值(消费);Function<T,R>:接收 T,返回 R(映射);Supplier<T>:无参数,返回 T(供给);Runnable:无参数,无返回值(线程 / 任务)。
# 示例
// 1. 自定义函数式接口(带@FunctionalInterface注解)
@FunctionalInterface
interface Calculator {
int compute(int a, int b); // 唯一抽象方法
// 允许静态方法
static void printResult(int result) {
System.out.println("结果:" + result);
}
// 允许默认方法
default int add(int a, int b) {
return compute(a, b) + 10;
}
}
// 2. Lambda表达式赋值给函数式接口
Calculator add = (a, b) -> a + b;
System.out.println(add.compute(2, 3)); // 5
Calculator.printResult(add.add(2, 3)); // 结果:15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#
上次更新: 12/30/2025