如何用Java Streams按txnId分组后合并同sku的quantity和amount?
实现前提
请先为你的Item类补充必要方法,保证代码可正常运行:
- 所有字段的getter方法,用于读取字段值
- 全参数构造方法,用于构造合并后的新
Item对象(如果选择复用原有对象的实现方式可以不用,推荐新建对象避免污染原始数据) - 如果选择复用原有对象的实现方式,还需要补充
quantity和amount字段的setter方法
核心实现代码
使用JDK内置的Stream收集器组合即可实现需求,无需额外引入第三方依赖:
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; // ... 你的其他业务代码 // 假设原始Item列表为 itemList Map<String, List<Item>> result = itemList.stream() // 第一层分组:按txnId分组 .collect(Collectors.groupingBy( Item::getTxnId, // 同txnId分组内的下游处理逻辑 Collectors.collectingAndThen( // 同txnId下按sku分组,相同sku自动合并 Collectors.toMap( Item::getSku, Function.identity(), // 相同sku的合并规则:quantity和amount累加,sku和txnId保持一致 (item1, item2) -> new Item( item1.getSku(), item1.getQuantity() + item2.getQuantity(), item1.getAmount() + item2.getAmount(), item1.getTxnId() ) ), // 将sku为key的Map转为你需要的List<Item>结构 skuItemMap -> new ArrayList<>(skuItemMap.values()) ) ));
可选:复用原有对象的实现
如果你不需要保留原始列表的数据,可以修改合并逻辑直接修改原有对象,省去新建对象的开销:
把toMap的合并函数替换为如下实现即可:
(item1, item2) -> { item1.setQuantity(item1.getQuantity() + item2.getQuantity()); item1.setAmount(item1.getAmount() + item2.getAmount()); return item1; }
内容的提问来源于stack exchange,提问作者user641887
相关产品推荐
相关产品推荐

