Java Stream API 大数据优化核心是“边读、边转、边写”,避免全量驻留;慎用sorted()等有状态操作,优先使用原始类型流(如IntStream)、保持流式管道、审慎启用parallelStream()。

Java Stream API 处理大数据量时,内存消耗主要来自全量驻留、装箱开销、中间集合膨胀和不当的有状态操作。优化核心不是禁用 Stream,而是让数据“边读、边转、边写”,全程不囤积。
避免全量驻留:慎用有状态中间操作
sorted()、distinct()、limit()、skip() 等操作需缓存部分或全部数据才能完成,极易触发 OOM。
- ❌ 错误写法:
Files.lines(path).sorted().filter(s -> s.contains("ERROR")).limit(100)—— 先加载整个大文件再排序 - ✅ 正确做法:把 filter 提前,大幅缩小待处理规模:
Files.lines(path).filter(s -> s.contains("ERROR")).sorted().limit(100) - 超大数据排序/去重,应放弃内存方案:改用数据库 ORDER BY / DISTINCT、分块排序+归并(外部排序),或先 hash 后 Set 去重
绕过装箱开销:优先使用原始类型流
Stream
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 数值生成:用
IntStream.range(1, 1_000_000)替代Stream.iterate(...).mapToInt(...) - 数组转换:用
Arrays.stream(intArray),而非Arrays.stream(IntegerArray) - 聚合计算:直接调用
IntStream.sum()、IntStream.average(),避免 reduce + 包装类累加器 - 注意:List
转 IntStream 必须用 list.stream().mapToInt(Integer::intValue),虽有一次拆箱,但比全程包装更优
保持流式管道:不落地中间集合
任何 collect(Collectors.toList())、toArray() 或 new ArrayList() 都是内存断点,应全程保持流形态。
立即学习“Java免费学习笔记(深入)”;
- 文件处理:用
Files.lines(path)+ try-with-resources,绝不 collect 成 List;分页可用skip(m).limit(n) - 数据库查询:MyBatis 加
@Options(fetchSize = 5000),JDBC 设statement.setFetchSize(5000),返回Stream<entity></entity> - Excel 导出:EasyExcel 直接
write(dataStream, sheet).doWrite();SXSSF 必须设new SXSSFWorkbook(100)控制内存行数 - 字段映射只取必要字段,如
map(e -> new SimpleRecord(e.getId(), e.getName())),不保留完整实体引用
审慎使用并行与收集器
parallelStream() 不是加速银弹,配置不当反而放大内存与线程问题。
- 仅当数据量 > 10 万、操作纯 CPU 计算(无 I/O、无锁、无共享变量)时启用并行
- 并行收集必须用线程安全方式:
Collectors.toConcurrentMap()或自定义Collector,避免toList()引发扩容竞争 - 预估结果规模,用
Collectors.toCollection(() -> new ArrayList(estimatedSize))减少 ArrayList 扩容次数 - 小数据量(如

















