2016-07-15 54 views
0

我就是喜歡這樣的數據:使用Java 8拉姆達轉換列表中映射到不同的地圖

List<Map<String, String>> = // psuedocode 
[ 
{ 
    "ID": "a", 
    "Value": "val1" 
}, 
{ 
    "ID": "b", 
    "Value": "val2" 
}, 
] 

我想打開這

Map<String, String> = // more pseudocode 
{ 
"a": "val1", 
"b": "val2" 
} 

我有這樣的事情至今:

Map<String, String> output = myList.stream() 
      .flatMap(m -> m.entrySet().stream()) 
      .collect(Collectors.toMap()) 

有人能指導我嗎?另一種方法是使用常規循環,但我試圖使用lambdas。

+1

而不是僞代碼,如果你能想出一個[mcve]會有幫助。這將阻止其他人不得不重複創建一個小測試。事實上,你的代碼到目前爲止沒有引用「ID」或「值」有點令人驚訝......聽起來你應該將每個Map 映射到一個單一的鍵值對中... –

回答

5

您需要將列表中的每個Map實例映射到密鑰和值,然後收集到單個Map實例中。

Map<String, String> output = myList.stream() 
    .collect(Collectors.toMap(m -> m.get("ID"), m -> m.get("Value"))); 

如果「ID」重複,這將引發異常。有重載的方法可以讓你更好地控制這種行爲。

0

而上述方案是偉大的,我得到的結果如下:

//declared a result map 
Map<String, String> result = new ConcurrentHashMap<String, String>(); 

list.parallelStream().forEach(m -> result.put(m.get("id"), m.get("value"))); 

您可以在併發處理的情況下是安全的。