如何用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
相关产品推荐
相关产品推荐

