Collectors中的groupingBy和reducing 细节问题
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;
}

浙公网安备 33010602011771号