Java Stream API 的核心价值在于让开发者专注“要什么结果”,框架处理“怎么处理”;转换操作(map/mapToInt)重塑数据形态,聚合操作(sum/collect/count)提炼结果,二者链式协作实现简洁高效的数据处理。

Java Stream API 的核心价值在于把“怎么处理”交给框架,开发者只需专注“要什么结果”。转换(map、mapToInt 等)负责数据形态重塑,聚合(sum、collect、count 等)负责结果提炼——二者配合,就能用几行代码替代传统循环+临时变量的冗长逻辑。
转换操作:从字符串到数值,从对象到字段
转换是聚合的前提。常见场景不是直接处理数字,而是面对字符串、日期、嵌套对象等原始形式。
- 用 mapToInt() 直接转原始 int 流:避免 Integer 装箱开销,且能调用
sum()、average()等原生方法。例如从订单列表提取数量:orders.stream().mapToInt(Order::getQuantity) - 用 map() 提取字段或做结构变换:比如把
List<Person>映射为List<String>姓名列表:persons.stream().map(Person::getName) - 多级转换可链式组合:先
filter()再map(),或先map()再mapToInt(),中间操作不执行,只构建管道
聚合操作:统计、分组、归约一步到位
聚合是流处理的终点目标,必须由终端操作触发。它不返回 Stream,而是具体结果。
-
基础统计:对
IntStream直接调sum()、max();对普通 Stream 用collect(Collectors.summingInt(...)) -
分组计数:按月份和事件类型复合分组,用
Collectors.groupingBy(keyMapper, Collectors.counting()),输出Map<MonthState, Long> -
自定义归约:用
reduce()实现复杂逻辑,如计算加权平均值;但多数场景推荐语义更清晰的collect()配合预置收集器
转换与聚合的典型协作流程
真实业务很少只做单一动作,往往是“清洗→转换→聚合”三步闭环。
立即学习“Java免费学习笔记(深入)”;
- 过滤无效数据:
filter(p -> p.getEventDate() != null && p.getEvent() != null) - 构造分组键:
map(p -> new MonthState(p.getEventDate().getYear(), p.getEventDate().getMonthValue(), p.getEvent())) - 聚合计数并转 DTO:
collect(Collectors.groupingBy(Function.identity(), Collectors.counting())),再遍历 Map 构建最终响应列表
性能与写法提醒
写法简洁不等于无脑链式。几个关键点影响实际效果:
- 优先用 mapToInt / mapToLong 替代
map(Integer::parseInt),尤其在大数据量下,原始类型流减少 GC 压力 - 避免在
map或filter中做耗时操作(如远程调用、文件读取),流本身不保证执行顺序(除非是forEachOrdered) - 并行流(
parallelStream())适合 CPU 密集型、无状态操作;含 I/O 或共享变量时慎用


















