我有一个List<Map<String, String>>
。我想将其转换为单个地图。
列表大小可以是1..n。不确定如何使用Java 8 Stream做到这一点?
List<Map<String, String>> mapList = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("1", "One");
map1.put("2", "Two");
Map<String, String> map2 = new HashMap<>();
map2.put("3", "Three");
map2.put("4", "Four");
mapList.add(map1);
mapList.add(map2);
Map<String, String> finalMap = new HashMap<>();
我们可以在Java 7中执行以下操作:
for(Map<String, String> map : mapList) {
for(String key : map.keySet()) {
finalMap.put(key, map.get(key));
}
}
System.out.println("Final Map " + finalMap); // Final Map {1=One, 2=Two, 3=Three, 4=Four}
答案 0 :(得分:4)
您可以flatMap
,然后使用Collectors.toMap
:
mapList.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
请注意,不会处理重复的键。要忽略重复项,可以使用:
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1)
答案 1 :(得分:0)
这是一种方法。我选择一种通过将重复项放在字符串列表中来处理重复项的方法。我在另一个地图中添加了每个地图的副本以进行演示。
List<Map<String, String>> mapList = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("1", "One");
map1.put("2", "Two");
map1.put("4", "Four");
Map<String, String> map2 = new HashMap<>();
map2.put("3", "Three");
map2.put("1", "One");
map2.put("4", "Four");
mapList.add(map1);
mapList.add(map2);
Map<String,List<String>> combined = mapList.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Entry::getKey,
Collectors.mapping(Entry::getValue,
Collectors.toList())));
combined.entrySet().forEach(System.out::println);
打印
1=[One, One]
2=[Two]
3=[Three]
4=[Four, Four]