java stream api分组求和核心是collectors.groupingby搭配summingint/double/long;bigdecimal需mapping+reducing;可按key或value排序;支持filter后聚合。

Java Stream API 的分组求和是日常开发中高频使用的数据聚合操作,核心就是 Collectors.groupingBy 搭配对应类型的求和收集器。写法简洁、逻辑清晰,替代了传统 for 循环+Map 手动累加的冗长代码。
基础分组求和(int/double/long)
针对基本数值类型,JDK 已内置专用收集器,直接调用即可:
-
summingInt:用于
int类型字段(如年龄、数量、分数) -
summingDouble:用于
double类型字段(如金额、权重) -
summingLong:用于
long类型字段(如ID计数、大额累计)
示例:按商品类别汇总销售额(double)
.collect(Collectors.groupingBy(Sale::getCategory, Collectors.summingDouble(Sale::getAmount)));
BigDecimal 类型必须自定义求和
由于精度敏感,BigDecimal 没有内置 summing 收集器。不能转成 double/int 再求和,否则会丢失精度或抛异常。正确做法是用 mapping + reducing 组合:
- 先用
mapping(Student::getStature, ...)提取每个元素的 BigDecimal 字段 - 再用
reducing(BigDecimal.ZERO, BigDecimal::add)安全累加
示例:按学生姓名汇总身高总和(BigDecimal)
.collect(Collectors.groupingBy(Student::getName,
Collectors.mapping(Student::getStature,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
分组后排序输出(按 key 或 value)
groupingBy 默认返回 HashMap,无序。如需有序结果,有两种常用方式:
-
按分组键排序:传入
TreeMap::new作为 mapFactory 参数 -
按求和值排序:先 collect 成 Map,再转为 List
排序后重建 LinkedHashMap
示例:按销售额从高到低排序展示
Map.sorted(Map.Entry.
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
带条件过滤的分组求和
实际业务常需先筛选再聚合。把 filter 放在 stream() 后、collect() 前,语义明确且高效:
- 只统计“已支付”订单的金额
- 只汇总“有效状态”的库存数量
- 排除测试账号或空值数据
示例:统计各地区成功订单总金额
Map.filter(order -> "PAID".equals(order.getStatus()))
.collect(Collectors.groupingBy(Order::getRegion,
Collectors.summingDouble(Order::getAmount)));
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











