java groupingBy的map取部分key在汇总计算

202 阅读1分钟

今天接收到一个奇怪的需求: 一个<String,BigDecimal>的map需要将key的一部分取出来再次分组,然后将新分组的值进行汇总。

Map<String, BigDecimal> map = new HashMap<>();
map.put("1:2", BigDecimal.valueOf(2));
map.put("1:3", BigDecimal.valueOf(2));
map.put("1:4", BigDecimal.valueOf(2));
map.put("1:5", BigDecimal.valueOf(2));
map.put("1:6", BigDecimal.valueOf(2));

Map<String, BigDecimal> result = map.entrySet().stream().collect(
        Collectors.groupingBy(entry -> entry.getKey().split(":")[0], HashMap::new, Collectors
                .mapping(entry -> entry.getValue(), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
System.out.println(result);

结果集: {1=10}

groupingBy参数1:分组的key

groupingBy参数2:最后的数据结构

groupingBy参数3:收集者

实现需求的关键点在于:我们前两个参数将,分组结果变为了

{1=["1:2"=2,"1:3"=2,"1:3"=2,"1:4"=2,"1:5"=2,"1:6"=2]}

collectors的mapping函数中也有两个参数,参数1是取值,参数2是取出来的值怎么处理(这里可以无限套娃)

参数1会将数据处理为如下格式

[2,2,2,2,2]

参数2的reduce操作就可以将结果进行累加,最后结果为

10