Map<String, List<String>> map1 = new HashMap<>();
Map<String, List<String>> map2 = new HashMap<>();
map1.put("a", Lists.newArrayList("1","123"));
map1.put("b", Lists.newArrayList("2","223"));
map2.put("c", Lists.newArrayList("11","1123"));
map2.put("a", Lists.newArrayList("22","2223"));
Map<String, List<List<String>>> collect = Stream.of(map1, map2)
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())
));
System.out.println(collect);打印:{a=[1,123,22,2223,1,123],b=[2,223],c=[11,1123]}
如何打印:{a=22,2223,1,123,b=2,223,c=11,1123}
发布于 2022-02-09 10:40:18
您可以使用一个简单的for循环并这样做。
List<Map<String, List<String>>> source = Arrays.asList(map1, map2);
for (Map<String, List<String>> m : source) {
for (Map.Entry<String, List<String>> e : m.entrySet()) {
target.computeIfAbsent(e.getKey(), unused -> new ArrayList<>())
.addAll(e.getValue());
}
}基于流的对应对象应该是这样的。
Map<String, List<String>> res = source.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.flatMapping(e -> e.getValue().stream(), Collectors.toList())));Collectors.flatMapping可以从java9开始使用。如果您正在使用java8,我建议您为flatMapping编写自己的自定义收集器,并在这里使用它。这也将为Java9提供一个更容易的迁移策略。你可以找到一个解释here。
发布于 2022-02-09 10:57:54
我一开始就不会创建List<List<String>>
Map<String, List<String>> map1 = new HashMap<>();
Map<String, List<String>> map2 = new HashMap<>();
map1.put("a", Lists.newArrayList("1","123"));
map1.put("b", Lists.newArrayList("2","223"));
map2.put("c", Lists.newArrayList("11","1123"));
map2.put("a", Lists.newArrayList("22","2223"));
Map<String, List<String>> collect = Stream.of(map1, map2)
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.flatMapping(e -> e.getValue().stream(), Collectors.toList())));https://stackoverflow.com/questions/71047692
复制相似问题