You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Stream遍历嵌套列表,按discountCode分组汇总discountAmount

Java Stream实现按折扣码分组汇总金额

问题背景

现有数据结构:Order包含External列表,每个External又包含Discount列表,示例结构如下:

Order
├─ External 1
│  ├─ Discount 1 (discountCode 'discount1' , discountAmount 100)
│  └─ Discount 2 (discountCode 'discount2' , discountAmount 10)
└─ External 2
   └─ Discount 1 (discountCode 'discount1' , discountAmount 110)

对应的初始化代码:

External external1 = new External();
Discount d1 = new Discount();
d1.setDiscountAmount(100);
d1.setDiscountCode("discount1");
Discount d2 = new Discount();
d2.setDiscountAmount(10);
d2.setDiscountCode("discount2");
external1.setDiscount(Arrays.asList(d1,d2));

External external2 = new External();
Discount d3 = new Discount();
d3.setDiscountAmount(110);
d3.setDiscountCode("discount1");
external2.setDiscount(Arrays.asList(d3));

Order order = new Order();
order.setExternal(Arrays.asList(external1,external2));

需求:遍历Order中的External列表,按discountCode分组,汇总所有对应折扣码的discountAmount,最终得到Map<String, Integer>格式结果(比如discount1对应210,discount2对应10)。

解决方案代码

通过Java Stream的扁平化流、分组收集结合求和汇总即可实现,代码如下:

Map<String, Integer> discountSumMap = order.getExternal().stream()
    // 将每个External的Discount列表扁平化为单个Discount流
    .flatMap(external -> external.getDiscount().stream())
    // 按discountCode分组,同时汇总每组的discountAmount
    .collect(Collectors.groupingBy(
        Discount::getDiscountCode,
        Collectors.summingInt(Discount::getDiscountAmount)
    ));

代码说明

  • order.getExternal().stream():将Order中的External列表转换为Stream,开启流式处理。
  • flatMap(external -> external.getDiscount().stream()):使用flatMap把每个External对应的Discount列表“展开”,合并成一个统一的Discount流,方便后续直接处理单个Discount对象。
  • Collectors.groupingBy(...):分组收集器,第一个参数指定分组键为discountCode,第二个参数summingInt作为下游收集器,负责对每组的discountAmount求和,最终生成键为折扣码、值为对应总金额的Map。

内容的提问来源于stack exchange,提问作者SyAu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:05:26