Stream API 三步曲是创建Stream、中间操作、终结操作:第一步建立数据通道但不处理,第二步链式添加惰性操作模块,第三步触发执行并关闭流不可重用。

记住 Stream API 的三步曲,关键不是死背顺序,而是理解每一步的目的和不可逆性。它本质上是一条单向流水线:数据进、加工、出结果,中途不能倒车,也不能重复启动。
第一步:创建 Stream —— “把原料放进流水线”
这步不处理数据,只建立通道。就像打开水龙头前先接好水管。常见方式就三种,记口诀:“集、数、of”:
-
集:集合对象调用
.stream()或.parallelStream()(如list.stream()) -
数:数组用
Arrays.stream(arr) -
of:零散元素用
Stream.of("a", "b", "c")
注意:创建后流是空转的,还没开始干活。
第二步:中间操作 —— “在流水线上装加工模块”
这是真正写逻辑的地方,但全部不执行。每次调用 filter、map、sorted 等,只是往流水线上“加一个模块”,返回一个新的 Stream。你可以连着加十几个,它都忍着不动——直到第三步触发。
立即学习“Java免费学习笔记(深入)”;
- 所有中间方法返回值仍是
Stream,所以能链式调用 - 常见方法:filter(筛选)、map(转换)、limit/skip(截取/跳过)、distinct(去重)
- 记一个特征:它们都不改变原数据,也不产生最终结果
第三步:终结操作 —— “按下启动按钮,一次出成品”
这是唯一真正执行整条流水线的步骤。一旦调用,前面所有中间操作才从头到尾跑一遍,然后立刻关闭流——不能再调任何 Stream 方法(否则抛 IllegalStateException)。
- 终结方法返回值不再是 Stream,比如
void(forEach)、long(count)、List(collect) - 常用方法:forEach(遍历)、collect(收集成集合)、count(计数)、findFirst(找第一个)、reduce(聚合)
- 小技巧:看到方法返回类型不是
Stream,基本就是终结操作
一个顺口溜帮你锚定记忆
“先开管(创建),再装机(中间),最后通电出货(终结)”——管子没开,机器白装;机器装完不通电,永远没产出;通了电,管子就废了,得重新开。


















