阿超
>
List<Map>聚合为单个Map<List>
科学是到处为家的,不过,在任何不播种的地方,是决不会得到丰收的。——赫尔岑
前两天有人给我的项目stream-query
提交了PR
,新增了一个Collector
实现
我稍微研究了一下,发现与Collectors
原生命名风格不统一,且不具备Collectors
包下面的对象通用性,于是就移除了
但这个功能是可以保留的
我的实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Test void testReducing() { Set<Map<String, Integer>> nameScoreMapList = Stream.of( new HashMap<String, Integer>() {{ put("苏格拉底", 1); put("特拉叙马霍斯", 3); }}, Collections.singletonMap("苏格拉底", 2), Collections.singletonMap("特拉叙马霍斯", 1), Collections.singletonMap("特拉叙马霍斯", 2) ).collect(java.util.stream.Collectors.toSet()); Collector<Map<String, Integer>, ?, Map<String, List<Integer>>> reducing = Collectors.reducing(new HashMap<>(), value -> { Map<String, List<Integer>> result = new HashMap<>(); value.forEach((k, v) -> result.computeIfAbsent(k, i -> new ArrayList<>()).add(v)); return result; }, (l, r) -> { r.forEach((k, v) -> l.computeIfAbsent(k, i -> new ArrayList<>()).addAll(v)); return l; } ); Assertions.assertEquals(new HashMap<String, List<Integer>>() {{ put("苏格拉底", Arrays.asList(1, 2)); put("特拉叙马霍斯", Arrays.asList(3, 1, 2)); }}, nameScoreMapList.stream().collect(reducing)); }
|
List<Map<KEY,VALUE>>
转换为Map<KEY,List<VALUE>>
,相同的key
值累加处理