Java流转换要设置的地图列表

AKJ*_*J88 5 java collections lambda java-8 java-stream

我有一个地图列表形式的数据结构: List< Map<String, List<String>> >

我想Set使用java 8功能在一个单元中收集列表的所有元素(映射的值).

例:

Input:  [ {"a" : ["b", "c", "d"], "b" : ["a", "b"]}, {"c" : ["a", "f"]} ]
Output: ["a", "b", "c", "d", "f"]
Run Code Online (Sandbox Code Playgroud)

谢谢.

laz*_*dog 12

您可以使用一系列Stream.mapStream.flatMap:

List<Map<String, List<String>>> input = ...;

Set<String> output = input.stream()    // -> Stream<Map<String, List<String>>>
    .map(Map::values)                  // -> Stream<List<List<String>>>
    .flatMap(Collection::stream)       // -> Stream<List<String>>
    .flatMap(Collection::stream)       // -> Stream<String>
    .collect(Collectors.toSet())       // -> Set<String>
    ;
Run Code Online (Sandbox Code Playgroud)


fab*_*ian 5

使用flatMap用于此目的

List< Map<String, List<String>> > maps = ...
Set<String> result = maps.stream()
                         .flatMap(m -> m.values().stream())
                         .flatMap(List::stream)
                         .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 5

.flatMap基于解决方案的替代方案是将这些子迭代融合到最终collect操作中:

Set<String> output = input.stream()
    .collect(HashSet::new, (set,map) -> map.values().forEach(set::addAll), Set::addAll);
Run Code Online (Sandbox Code Playgroud)