精通 Java 8 (Lambda expression & functional interface) - 第2天
发布: (2026年2月1日 GMT+8 23:55)
5 min read
原文: Dev.to
Source: Dev.to
请提供您希望翻译的具体文本内容,我将按照要求保留来源链接、格式和技术术语,仅翻译正文部分。
什么是 Lambda 表达式? – “匿名函数”
lambda 表达式是一种简洁的方式,用于表示匿名(无名)函数。
它让你可以把“代码视为数据”,并显著减少样板代码。
结构
(parameters) -> { body }
| 部分 | 描述 |
|---|---|
| (parameters) | 输入参数。 • 单个参数 → 括号可省略,例如 s -> …• 无参数 → 空括号,例如 () -> … |
| ->(箭头符号) | 分隔参数列表和实现体。它的含义相当于“指向”或“执行”。 |
| { body } | 要执行的代码。 • 单个表达式 → 省略 {} 和 return 关键字(结果会隐式返回)。• 多条语句 → 保留 {},并在需要返回值时使用 return。 |
示例:旧方式 vs. Lambda 方式
Java 8 之前 – 匿名内部类
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked!");
}
});

使用 Lambda 表达式 – 简洁清晰
button.addActionListener(e -> System.out.println("Button clicked!"));

注意,Lambda 去除了所有冗余代码,专注于实际操作。
Lambda 的“家” – 函数式接口
A 函数式接口 是指声明了 恰好一个抽象方法 的任何接口。
它可以包含任意数量的默认或静态方法,但只有一个方法需要实现。
Common built‑in functional interfaces:
RunnableCallableComparator
Java 8 还引入了 java.util.function 包,提供了一套丰富的即用型函数式接口。
四大核心 – 必备的 java.util.function 接口
这四个是你最常会用到的工作马。
1️⃣ Predicate – 测试器
- 目的: 接受类型为
T的值并返回boolean。非常适合过滤或条件检查。 - 抽象方法:
boolean test(T t)
示例 – 检查一个数字是否为偶数
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true

2️⃣ Function – 转换器
- 目的: 接受类型为
T的值并返回类型为R的结果。完美用于把一种类型映射到另一种类型。 - 抽象方法:
R apply(T t)
示例 – 将 String 转换为其长度 (Integer)
Function<String, Integer> length = s -> s.length();
System.out.println(length.apply("hello")); // 5

3️⃣ BiFunction – 组合器
- 目的: 接受两个参数(
T和U),产生类型为R的结果。适用于需要合并两个值的操作。 - 抽象方法:
R apply(T t, U u)
示例 – 两个整数相加
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println(add.apply(3, 7)); // 10

4️⃣ Consumer – 执行者
- 目的: 接受类型为
T的值并返回 无(void)。它“消费”输入以执行某个动作。 - 抽象方法:
void accept(T t)
示例 – 将消息打印到控制台
Consumer<String> printer = msg -> System.out.println(msg);
printer.accept("Hello, Lambda!");

TL;DR
- Lambda expressions 让你可以使用最小的语法编写匿名函数。
- 它们始终针对 functional interface ——即只有一个抽象方法的接口。
java.util.function包提供了最实用的接口,尤其是 Predicate、Function、BiFunction 和 Consumer。
Bonus: The Supplier(提供者)
虽然它不是所谓的 “四大” 之一,但 Supplier 同样重要。
-
目的: 不接受任何输入,返回类型为
T的单个结果。它 提供 一个值。 -
抽象方法:
T get();
示例 – 生成随机数
Supplier<Integer> randomNum = () -> new Random().nextInt(100);
System.out.println(randomNum.get());

为什么要使用 Lambdas?
好处显而易见:
- 简洁的代码 – 减少样板代码,让业务逻辑更突出。
- 可读性 – 通常更像自然语言,尤其在与 Streams 配合使用时。
- 函数式编程 – 使 Java 能以更函数式的风格编写代码。
- Stream API 集成 – Lambdas 是强大 Java Stream API 的核心,能够实现优雅的数据处理。