让我们说:
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
答案 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]}