java stream从Map获取Map

时间:2015-12-13 15:57:07

标签: java java-8 java-stream

让我们说:

Map<String, Map<String, List<Integer>>> 

我想得到

Map<String, List<Integer>>

我使用平面地图:

myMap.values().stream().flatMap(p -> p.values());

获取Stream但我不知道如何使用collect。我也想:

myMap.values().stream().flatMap(p -> p.values()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

但这不起作用

编辑:

我已经提供了数据:

List<Integer> numbers1 = Arrays.asList(1, 2);
List<Integer> numbers2 = Arrays.asList(3, 4);
List<Integer> numbers3 = Arrays.asList(5, 6);
List<Integer> numbers4 = Arrays.asList(7, 8);

Map<String, List<Integer>> innerMap1 = new HashMap<>();
innerMap1.put("first", numbers1);
innerMap1.put("second", numbers2);

Map<String, List<Integer>> innerMap2 = new HashMap<>();
innerMap2.put("third", numbers3);
innerMap2.put("forth", numbers4);

Map<String, Map<String, List<Integer>>> outerMap = new HashMap<>();
outerMap.put("mon", innerMap1);
outerMap.put("tue", innerMap2);

从这段代码我想得到Map<String, List<Integer>> 数据:

key: "first",  values: 1,2 
key: "second", values: 3,4
key: "third",  values: 5,6 
key: "forth",  values: 7,8

2 个答案:

答案 0 :(得分:2)

您需要创建地图所​​有条目的Stream,并与传入条目的值中包含的地图的每个条目展平,最后将其收集到地图中。

Map<String, List<Integer>> result =
        outerMap.entrySet()
                .stream()
                .flatMap(e -> e.getValue().entrySet().stream())
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

System.out.println(result); // prints {third=[5, 6], forth=[7, 8], first=[1, 2], second=[3, 4]}

这不保证结果地图中的任何订单。

答案 1 :(得分:1)

由于您不关心外部地图的关键字,您可以简单地使用values()的流,并通过将所有地图合并到一个新的地图中来收集:

final HashMap<Object, List<Integer>> result =
    outerMap.values()
            .stream()
            .collect(HashMap::new, Map::putAll, Map::putAll);
System.out.println(result);

打印:

{third=[5, 6], forth=[7, 8], first=[1, 2], second=[3, 4]}