2017-08-29 39 views
1

我正在學習使用Java8和Stream進行操作。我有一個問題,我正在嘗試使用java8流解決。在Java 8中:製作集<V>在所有列表中的對象中都是值的地圖<K, List<V>>

我有Map<String, List<Integer>> accountMap型 數據的地圖 - {0000132861=[6613, 6170, 6206], 0000135932=[6613, 6170, 6206], 0000122989=[6613, 6170, 6206], 0000138372=[3187, 6613, 8167, 6170, 6206], 0000138399=[6613, 6170, 6206]}

我希望所有的Map.value內唯一的整數值()。 像[3187, 6613, 8167, 6170, 6206]

當我做accountMap.values()我得到List<List<Integer>> [[6613, 6170, 6206], [6613, 6170, 6206], [6613, 6170, 6206], [3187, 6613, 8167, 6170, 6206], [6613, 6170, 6206]]

當我做accountUserMap.values().stream().collect(Collectors.toSet())我得到相同的數據類型Set<List<Integer>> [[3187, 6613, 8167, 6170, 6206], [6613, 6170, 6206]]但是所有的副本列表中刪除。

我要刪除所有重複值,並希望得到Set<Integer> [3187, 6613, 8167, 6170, 6206]

應該有一個有效的方式做到這一點,而無需使用.forEach()或迭代列表。

回答

4

您可以使用flatMap 「平坦」 的價值觀流:

map.values().stream() 
    .flatMap(List::stream) 
    .collect(toSet()); 

或者,你可以使用3個參數的collect

map.values().stream() 
    .collect(HashSet::new, Set::addAll, Set::addAll); 
0

從未使用過流自己,但不是隻需在您的代碼中使用stream(),請嘗試:

stream().flatMap(p -> p.stream()) 

解壓下一個列表級別。

這就是這個answer暗示在類似的情況下

相關問題