peek () 方法在 Java 8 中的作用?
peek()是 Java 8 Stream API 中的中间操作,核心作用是 “遍历流中的元素并执行副作用操作(如打印、调试),但不改变流的元素”,具体特性如下:
# 1. 核心特性
- 惰性执行:作为中间操作,仅在终端操作(如
forEach、collect)触发时执行; - 不改变流结构:仅读取元素,不新增、删除或修改流中的元素(修改元素属性除外,但不推荐);
- 支持链式调用:可与其他中间操作(如
filter、map)串联。
# 2. 与 forEach () 的区别
| 对比维度 | peek ()(中间操作) | forEach ()(终端操作) |
|---|---|---|
| 操作类型 | 中间操作,不触发流执行 | 终端操作,触发流执行 |
| 核心作用 | 调试、日志记录(副作用操作) | 消费元素(最终处理) |
| 流状态 | 执行后流仍可继续处理(如后续collect) | 执行后流关闭,不可再使用 |
# 3. 适用场景
- 调试流处理:查看流中元素在各中间操作后的状态(如过滤后、映射后的元素);
- 日志记录:记录流中元素的处理过程(如打印元素值);
- 临时修改元素属性(不推荐,易引发副作用)。
# 示例
List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> result = list.stream()
.filter(s -> s.length() > 5) // 过滤长度>5的元素
.peek(s -> System.out.println("过滤后:" + s)) // 调试:打印过滤后的元素
.map(String::toUpperCase) // 转为大写
.peek(s -> System.out.println("映射后:" + s)) // 调试:打印映射后的元素
.collect(Collectors.toList()); // 终端操作(触发执行)
// 输出:
// 过滤后:banana
// 映射后:BANANA
// 过滤后:cherry
// 映射后:CHERRY
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
上次更新: 12/30/2025