今天接收到一个奇怪的需求: 一个<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