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
// 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()));
return vo;
}
参考: java-stream-groupby-and-reduce
标签:StatisticsVo,groupingBy,Collectors,System,vo,vo1,vo2,reducing From: https://www.cnblogs.com/ntmd32/p/18283137