使用collectors.groupingby按businesstype分组并求和,一行代码实现财务支出汇总;可扩展为统计笔数、均值等;需预处理null或空字符串业务类型。

用 Collectors.groupingBy 按业务类型汇总财务支出,核心是把支出对象按 businessType 字段分组,再对每组做聚合(如求和)。关键在于组合使用 groupingBy 和下游收集器(如 summingDouble)。
准备支出数据模型
确保支出对象有明确的业务类型字段和金额字段,例如:
public class Expense {
private String businessType; // 如 "研发"、"市场"、"人力"
private double amount;
// 构造器、getter 省略
}
基础分组求和(Map)
一行代码即可按业务类型汇总总支出:
Map<string double> totalByType = expenses.stream()
.collect(Collectors.groupingBy(
Expense::getBusinessType,
Collectors.summingDouble(Expense::getAmount)
));</string>
- 第一参数:分类函数,提取每笔支出的业务类型作为 key
- 第二参数:下游收集器,对同一类型的全部
amount值求和 - 结果形如
{"研发"=125000.0, "市场"=86000.0, "人力"=210000.0}
扩展:汇总更多维度(Map)
若需同时统计笔数、最大单笔、平均值等,可自定义汇总类并用 summarizingDouble 或 collectingAndThen:
Map<string doublesummarystatistics> statsByType = expenses.stream()
.collect(Collectors.groupingBy(
Expense::getBusinessType,
Collectors.summarizingDouble(Expense::getAmount)
));</string>
- 返回
DoubleSummaryStatistics,可调用.getSum()、.getCount()、.getAverage()等 - 也可用
toMap+ 自定义对象,或封装为ExpenseSummary类提升可读性
注意空值与默认值处理
若某些支出的 businessType 为 null,会被归入 key 为 null 的组;如需过滤或替换,提前处理:
- 过滤掉空类型:
expenses.stream().filter(e -> e.getBusinessType() != null) - 统一设为“其他”:
e.getBusinessType() != null ? e.getBusinessType() : "其他" - 确保
getBusinessType()不返回空字符串,避免无效分组










