前两天有人给我的项目stream-query
提交了PR
,新增了一个Collector
实现
我稍微研究了一下,发现与Collectors
原生命名风格不统一,且不具备Collectors
包下面的对象通用性,于是就移除了
但这个功能是可以保留的
我的实现如下:
代码语言:javascript复制@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
值累加处理