Java Stream处理Tuple结果如何按门店编码分组聚合对应产品列表
问题解答
1. 初始代码分组失效原因
你的转换逻辑是直接遍历每一行查询结果Tuple,每行都生成一个独立的StorePurchaseView对象,且每个对象的products属性仅包含当前行对应的单个产品对象,全程没有执行按门店编码聚合的逻辑,自然会出现同门店多产品拆分为多个门店对象的问题。
2. 分组代码编译错误解决
你写的groupingBy逻辑里,Collectors.mapping步骤把Tuple映射成了Long类型的产品编码,不是要求的StorePurchaseItemsView类型,同时代码里类名混淆(StorePurchaseView/StoreRepurchaseView、StorePurchaseItemsView/StoreRepurchaseItemsView),导致类型不匹配报错。
正确的转换代码示例
public Set<StorePurchaseView> viewConvert(Collection<Tuple> list) { // 先按门店编码分组,分组后把每行转成商品项,收集为Set Map<Integer, Set<StorePurchaseItemsView>> storeProductsMap = list.stream() .collect(Collectors.groupingBy( // 分组key:门店编码 tuple -> ofNullable(tuple.get("CD_STORE")) .map(Object::toString) .map(Integer::parseInt) .orElse(null), // 分组下游收集器:把当前分组的所有tuple转成商品项,存为Set Collectors.mapping( tuple -> StorePurchaseItemsView.builder() .productCode(ofNullable(tuple.get("CD_PRODUCT")) .map(Object::toString) .map(Long::parseLong) .orElse(null)) .lastPurchase(buildLastPurchase(tuple)) .build(), Collectors.toSet() ) )); // 把map转成目标StorePurchaseView集合 return storeProductsMap.entrySet().stream() .map(entry -> StorePurchaseView.builder() .storeCode(entry.getKey()) .products(entry.getValue()) .build()) .collect(Collectors.toSet()); }
注意:如果你的业务中门店编码允许为空,需要额外处理空值分组的逻辑,避免空指针异常。
内容的提问来源于stack exchange,提问作者Liam Park
相关产品推荐
相关产品推荐

