使用flatMap将地图列表转换为地图

时间:2017-10-26 22:13:19

标签: java java-8 flatmap

如何使用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()));

这不起作用。

3 个答案:

答案 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));

请注意最终替代方案中的合并功能。