java stream 通关需掌握三步:建流(从集合、数组、文件等正确创建)、串操作(filter/map/sorted等链式调用,注意顺序与性能)、收结果(collect/foreach/count等终端操作,流不可重用)。

Java Stream 通关秘籍,不是堆砌 API 列表,而是抓住三个关键:怎么建流、怎么串操作、怎么收结果。写清楚这三步,再配几个典型场景,新手就能上手,老手也能查漏补缺。
Stream 怎么创建才不踩坑
Stream 不是 new 出来的,必须从已有数据源“导出”。选错源头,后面全白搭:
- 集合用 collection.stream()(顺序)或 collection.parallelStream()(并行),别直接 new Stream
- 数组优先用 Arrays.stream(arr);基本类型数组(如 int[])更推荐 IntStream.of(1,2,3),避免 Integer 装箱开销
- 少量固定值用 Stream.of("a", "b", "c");需要生成序列时,用 Stream.iterate(0, n -> n + 1).limit(10) 或 Stream.generate(Math::random).limit(5)
- 文件读取用 Files.lines(Paths.get("file.txt")),记得 try-with-resources 包裹,防止资源泄漏
中间操作链怎么写才清晰高效
中间操作是“记账”,不干活;只有终端操作一触发,整条链才真正跑一遍。链式调用不是越长越好,关键是逻辑分层:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- filter 放前面:先筛掉大量无关数据,减少后续处理量(比如 .filter(u -> u.isActive()))
-
map 和 flatMap 分清用途:map 是一对一转换(String → Integer),flatMap 是一对多展开(List
→ Stream ) - sorted 尽量靠后:排序成本高,如果前面已用 limit(10),就别在 sort 前加 filter 之后还留一堆元素
- distinct 依赖对象的 equals/hashCode;对基本类型或 String 直接可用,自定义类务必重写这两个方法
终端操作怎么选才不出错
终端操作是“关门动作”,执行完流就失效。选错类型,要么得不到想要的结果,要么抛 IllegalStateException:
- 要新集合?用 collect(Collectors.toList()) —— 最常用,也支持 groupingBy、partitioningBy 等高级聚合
- 只做遍历打印或记录日志?用 forEach(System.out::println),但别在里面修改外部变量或集合
- 要统计或判断?count()、anyMatch(p -> p > 100)、findFirst() 返回 Optional,记得判空
- 要聚合计算?reduce 灵活但易错,简单求和/最大值优先用 summarizingInt 或 maxBy
并行流和常见陷阱提醒
parallelStream() 不是性能银弹,乱用反而拖慢:
- 适合 CPU 密集型、数据量大(通常 > 10000)、操作无状态(不改共享变量)的场景
- 含 I/O(如数据库查询、文件读写)、阻塞操作、或用了 synchronized 的流,坚决不用并行
- 流只能消费一次:写了 list.stream().filter(...).count(),再写 forEach 就会报错;需要复用,得重新创建流
- 避免在 map/filter 中做耗时操作(如远程调用),它会被重复执行多次(尤其并行时)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










