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.map和Stream.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)
使用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)
.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)