java stream流式处理遵循“创建流→中间操作→终端操作”三步:创建方式包括集合、数组、文件行或无限流;中间操作如filter、map、flatmap等为懒加载链式调用;终端操作如foreach、collect、count等触发执行且只能调用一次;流不可重复消费,操作非侵入,需注意性能与并行安全。

Java Stream 流式处理的核心语法围绕“创建流 → 中间操作 → 终端操作”三步展开,不是写一堆循环和临时集合,而是用链式调用表达数据处理意图。
Stream 创建方式要匹配数据源
流本身不存数据,必须从已有结构出发创建:
- 集合:直接调用 list.stream() 或 set.parallelStream()(并行)
- 数组:用 Arrays.stream(arr) 或 Stream.of("a","b","c")
- 特殊场景:如文件行用 Files.lines(path),无限流用 Stream.generate(Math::random).limit(5)
中间操作是懒加载的加工指令
这些方法不执行计算,只组装流水线,返回新流,可链式叠加:
- filter(s -> s.startsWith("张")):按布尔条件筛元素
-
map(s -> s.toUpperCase()):一对一转换,比如转大写、取属性(
user -> user.getName()) - flatMap(u -> u.getRoles().stream()):一对多展开,常用于扁平化嵌套列表
- sorted(Comparator.naturalOrder())、distinct()、limit(10) 也属于中间操作
终端操作触发执行并产生结果
没有终端操作,前面所有中间操作都不运行。它消耗流,且只能调用一次:
- forEach(System.out::println):遍历消费,无返回值
- collect(Collectors.toList()):汇总成集合,最常用
- count()、max(Comparator)、reduce(...):返回单个值
- anyMatch(s -> s.length() > 5):返回布尔判断结果
关键细节不能漏
写 Stream 时要注意几个硬性约束:
- 流只能被消费一次,重复调用终端操作会抛 IllegalStateException
- 原始集合不会被修改,所有操作都是非侵入式的
- 中间操作组合越多,越要留意性能——比如
filter尽量前置,减少后续处理数据量 - 大数据量且无状态操作时,可改用 parallelStream(),但注意线程安全和拆分成本
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











