stream流中对数据进行先分组在聚合,一般会想到使用groupingBy和reducing,但是reducing中的
identity
是只会初始化一次的,所以我们传参的时候传的是Object
,不是XXX::new
,在reducing的合并函数中我们不能返回vo1或者vo2,只能new一个对象
正确使用
Map<String, StatisticsVo> collect = statisticsVos.collect(Collectors.groupingBy(e -> e.getMaterialName(), Collectors.reducing(new RawMaterialStatisticsVo(), (vo1, vo2) -> {// TODO 这里必须返回一个新对象,而不是修改vo1 https://stackoverflow.com/questions/73755679/java-stream-groupby-and-reduce// System.out.println(System.identityHashCode(vo1)); // System.out.println(vo1);// System.out.println(vo2);// System.out.println("---------");return StatisticsVo.add(vo1, vo2);})));
实体中的add方法
public static StatisticsVo add(StatisticsVo vo1,StatisticsVo vo2) {StatisticsVo vo = new StatisticsVo();if(StrUtil.isEmpty(vo1.getMaterialName())){vo.setMaterialName(vo2.getMaterialName());}else {vo.setMaterialName(vo1.getMaterialName());}vo.setTotalAmount(NumberUtil.add(vo1.getTotalAmount(),vo2.getTotalAmount()));vo.setPlanOrderAmount(NumberUtil.add(vo1.getPlanOrderAmount(),vo2.getPlanOrderAmount()));vo.setErpOrderAmount(NumberUtil.add(vo1.getErpOrderAmount(),vo2.getErpOrderAmount()));vo.setErpSyncOrderAmount(NumberUtil.add(vo1.getErpSyncOrderAmount(),vo2.getErpSyncOrderAmount()));return vo;}
参考: java-stream-groupby-and-reduce