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;
}

参考: java-stream-groupby-and-reduce

posted @ 2024-07-04 10:47  zengli11  阅读(359)  评论(1)    收藏  举报