Stream 的惰性:没有终止操作就没有遍历
在 map 里加了打印语句,程序却没有输出,可能不是数据为空,而是流水线尚未被消费。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Java Full Course
Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
在 map 里加了打印语句,程序却没有输出,可能不是数据为空,而是流水线尚未被消费。
理解核心机制
Stream 中间操作描述转换,终止操作触发消费。流水线可以短路,框架也可能优化某些操作,因此不要把关键副作用放在 map 或 peek 中,期待每个元素都必然执行。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.util.List;
public class Demo {
public static void main(String[] args) {
var values = List.of(1, 2, 3, 4);
var result = values.stream()
.filter(value -> value % 2 == 0)
.map(value -> value * value)
.toList();
System.out.println(result);
}
}适用边界与常见误区
Stream 只能消费一次,toList 返回的列表不可修改。需要并行时也不能只加 parallel 而忽略共享状态、任务规模和执行环境。
继续练习
先移除 toList,观察是否有结果产生;再用 findFirst 比较短路行为,保持计算逻辑不依赖打印次数。