Java Stream API执行流程为创建流→中间操作→终止操作,终止操作触发执行且流不可复用;常见创建方式包括集合转流、数组转流、Stream.of、empty、generate、iterate;需遵守单次消费、无限流须限界、中间操作惰性执行三大约束。

Java Stream API 的核心流程就三步:创建流 → 中间操作(可选,链式处理)→ 终止操作。其中终止操作是触发执行的关键,没有它,前面所有操作都不会真正运行。
Stream 的六种常见创建方式
流不是数据容器,而是数据的“处理视图”。创建流不等于执行计算,只是准备管道:
-
集合转流:调用
list.stream()或set.stream();并行用parallelStream() -
数组转流:用
Arrays.stream(arr),基础类型数组(如int[])会返回对应原始类型流(IntStream) -
显式元素构建:
Stream.of("a", "b", "c"),适合少量已知值 -
空流:
Stream.empty(),常用于边界条件或默认返回值 -
生成无限流:
Stream.generate(() -> Math.random()),需配合limit(n)等终止条件使用 -
迭代生成流:
Stream.iterate(0, n -> n + 2),也属无限流,常用takeWhile或limit控制长度
终止操作的本质与典型用法
终止操作是流处理的“开关”——它强制执行整个中间操作链,并产生最终结果(或副作用),之后该流即失效,不可复用。
-
消费型:如
forEach(System.out::println),只做遍历,无返回值;注意并行流中顺序不保证 -
聚合型:如
count()返回long,reduce()做归约,sum()/max()等原始流特有方法 -
收集型:最常用的是
collect(Collectors.toList()),还可转成Set、Map、分组统计(groupingBy)、字符串拼接(joining)等 -
查找匹配型:如
findFirst()返回Optional,anyMatch(p)判断是否存在满足条件的元素
必须注意的三个关键约束
这些规则直接影响代码是否能编译、运行或得到预期结果:
立即学习“Java免费学习笔记(深入)”;
- 流只能被消费一次:调用过
forEach后再调用collect会抛IllegalStateException - 无限流必须有终止边界:对
generate或iterate创建的流直接调用count()会死循环 - 中间操作不执行:写完
stream.filter(...).map(...)没有任何效果,必须接终止操作才触发


















