2017-08-29 27 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暗示在类似的情况下

相关问题