Java Stream API 通过声明式链式调用高效完成集合统计分析:支持基础统计(count/sum/average/max/min/summaryStatistics)、分组计数(groupingBy+counting)、分类占比计算及多条件筛选+分组+聚合组合操作。

Java Stream API 是处理集合统计分析任务的高效工具,它用声明式写法替代繁琐循环,让代码更简洁、逻辑更清晰。核心在于把数据看作“流”,通过链式调用完成过滤、分组、聚合等操作,最终得出统计结果。
快速计数与基础统计
对集合元素做数量、总和、平均值、最值等基础计算,Stream 提供了直接可用的终端方法:
- count():返回 long 类型元素总数,无需额外转换
- sum() / average() / max() / min():需先转为数值流(如 mapToInt、mapToDouble),再调用对应方法;average 和 max/min 返回 Optional,记得用 orElse() 处理空值
- summaryStatistics():一步获取 count、sum、min、max、average 全部摘要,适合报表类场景
按字段分组并统计频次
这是最常见的分类统计需求,比如统计各地区用户数、各状态订单量。关键在 Collectors.groupingBy 配合 counting():
- 单级分组:
stream.collect(groupingBy(User::getRegion, counting()))→ 返回 Map<String, Long> - 保留原始列表:
stream.collect(groupingBy(User::getRegion))→ 返回 Map<String, List<User>> - 分组后取某字段汇总(如地区总积分):
groupingBy(User::getRegion, summingInt(User::getScore))
计算分类占比(比例统计)
单纯分组不够,还需将频次转化为百分比。做法是先获取总数,再对分组结果映射计算:
立即学习“Java免费学习笔记(深入)”;
- 先用
count()或collect(counting())得到总样本数 - 再用
collect(groupingBy(..., counting()))得到各分类数量 - 最后遍历 Map,用每个值除以总数,转成 double 并保留小数位(如 *100.0 / total)
- 也可用
collectingAndThen封装逻辑,避免手动遍历
多条件筛选+分组+聚合组合操作
真实业务常需叠加条件,比如“只统计有效订单中各品类的平均金额”:
- 用
filter()做前置筛选(如 order.getStatus().equals("VALID")) - 用
flatMap()展开嵌套结构(如从 Order → List<Item>) - 再用
groupingBy(Item::getCategory, averagingDouble(Item::getAmount)) - 整个链条一气呵成,中间不生成临时集合,内存友好



















