2015-12-13 59 views
1
獲取地圖

比方說,我們有:Java流從地圖

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

,我想獲得

Map<String, List<Integer>> 

我用平面地圖:

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

獲得流,但我不知道如何使用collect。我tride也:

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>> 帶數據:

回答

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]} 

這不能保證在結果圖中的任何順序。

+0

謝謝你的工作 –

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]}