Java Stream 业务操作手册:现代写法与性能边界
基线:Java 17/21/25。Stream API 核心语义稳定,但写法和边界需要现代化。
1. 收集结果
需要不可变结果时可以使用 Stream.toList();需要可变列表时显式收集到 ArrayList。不要假设所有 collector 都返回可变集合。
2. 常见边界
Stream 只能消费一次,终端操作后不能复用。toMap 遇到重复 key 会抛异常,groupingBy 会产生额外内存,空值和顺序必须提前定义。
3. 不要默认并行
parallelStream 共享公共 ForkJoinPool,不适合阻塞 I/O、事务操作、依赖 ThreadLocal 的逻辑或需要严格顺序的业务。并行化前先测量数据量、任务粒度、线程竞争和下游容量。
4. 适用原则
Stream 适合表达纯数据变换,不适合隐藏复杂副作用。避免在 map 中写数据库、发消息或修改共享集合。性能关键路径使用 JMH,而不是凭直觉判断。
5. 检查清单
确认短路操作、primitive stream、异常处理、Optional 嵌套、集合可变性和返回顺序。可读性优先于为了函数式而函数式。