2017-10-04 19 views
3

是否有可能(以簡單的方式)將其更改爲java8Stream? (請不要評論/如果你想告訴我有兩個for更好,不是所有的迴路應改爲流回答,它不是一個點)從列表創建地圖,其中按鍵是內部和外部對象的一部分

final Map<String, String> map = new HashMap<>(); 

for(final Person person: list) { 
    for(final Internal internal: person.getInternals()) { 
     final String key = person.getName() + internal.getKey(); 
     map.put(key, internal.getValue()); 
    } 
} 

的主要問題是,我無法使用flatMap,因爲我會失去以前的信息。 每個創建的key都是獨一無二的。

+2

你並不需要第二個循環可言,因爲它是一樣的:每個人,把它的名字和最後一個內部價值地圖。你可以在收集器 – mlecz

回答

5

那麼你可以通過Pair轉嫁給那些(我沒有,雖然編這一點,但這個想法應該有)

list.stream() 
    .flatMap(person -> person.getInternals() 
         .stream() 
         .map(internal -> 
          Pair.of(person.getName() + internal.getKey(), internal.getValue())) 
    .collect(Collectors.toMap(Pair::getLeft, Pair::getRight)); 
+0

中做到這一點是的,我知道,使用另一個對象是一個答案,但在這個解決方案中,我們需要第二個內部流。我希望有一個鏈條的答案 – ByeBye

+0

@ByeBye你會如何擺脫第二次迭代?我現在不明白你的意思 – Eugene

+1

@ByeBye這個*是*「一個鏈」 – Holger

2

您可以直接使用collect,如果你是確保每個創建的密鑰是獨一無二的,正如你所說,蓄電池和組合編寫簡單:

Map<String, String> map = 
    list.stream().collect(HashMap::new, 
          (m, p) -> p.getInternals().forEach(i -> m.put(p.getName() + i.getKey(), i.getValue())), 
          Map::putAll); 
相關問題