WMX · 随记
·Java· 3 分钟阅读

Stream 的惰性:没有终止操作就没有遍历

在 map 里加了打印语句,程序却没有输出,可能不是数据为空,而是流水线尚未被消费。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Full Course

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

在 map 里加了打印语句,程序却没有输出,可能不是数据为空,而是流水线尚未被消费。

理解核心机制

Stream 中间操作描述转换,终止操作触发消费。流水线可以短路,框架也可能优化某些操作,因此不要把关键副作用放在 map 或 peek 中,期待每个元素都必然执行。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java11 行 · 可横向滚动
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 比较短路行为,保持计算逻辑不依赖打印次数。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档