如何使用List<Map<String,String>>
将Map<String,String>
合并到flatMap
?
以下是我尝试的内容:
final Map<String, String> result = response
.stream()
.collect(Collectors.toMap(
s -> (String) s.get("key"),
s -> (String) s.get("value")));
result
.entrySet()
.forEach(e -> System.out.println(e.getKey() + " -> " + e.getValue()));
这不起作用。
答案 0 :(得分:6)
假设列表中包含的地图中没有冲突的密钥,请尝试以下操作:
Map<String, String> maps = list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
答案 1 :(得分:4)
如果您可以覆盖密钥,只需将Map
合并到collect
的单个地图中,即使没有flatMap
s:
public static void main(String[] args) throws Exception {
final List<Map<String, String>> cavia = new ArrayList<Map<String, String>>() {{
add(new HashMap<String, String>() {{
put("key1", "value1");
put("key2", "value2");
put("key3", "value3");
put("key4", "value4");
}});
add(new HashMap<String, String>() {{
put("key5", "value5");
put("key6", "value6");
put("key7", "value7");
put("key8", "value8");
}});
add(new HashMap<String, String>() {{
put("key1", "value1!");
put("key5", "value5!");
}});
}};
cavia
.stream()
.collect(HashMap::new, HashMap::putAll, HashMap::putAll)
.entrySet()
.forEach(System.out::println);
}
将输出:
key1=value1!
key2=value2
key5=value5!
key6=value6
key3=value3
key4=value4
key7=value7
key8=value8
答案 2 :(得分:3)
一种非常简单的方法就是使用putAll
:
Map<String, String> result = new HashMap<>();
response.forEach(result::putAll);
如果您特别想在单个流操作中执行此操作,请使用缩减:
response.stream().reduce(HashMap<String, String>::new, Map::putAll);
或者如果你真的想使用flatMap
:
response.stream().map(Map::entrySet).flatMap(Set::stream)
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, Map::putAll));
请注意最终替代方案中的合并功能。