我想使用List<E>
从Map<String,List<E>>
(E
是随机类)中提取stream()
。
我想要一个使用Java 8流的简单的单行方法。
到目前为止我一直在尝试什么:
HashMap<String,List<E>> map = new HashMap<>();
List<E> list = map.values(); // does not compile
list = map.values().stream().collect(Collectors.toList()); // does not compile
答案 0 :(得分:33)
map.values()
返回Collection<List<E>>
而不是List<E>
,如果需要后者,则需要将嵌套的List<E>
展平为单个List<E>
如下:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
答案 1 :(得分:14)
或使用forEach
map.forEach((k,v)->list.addAll(v));
或如Aomine所评论使用的
map.values().forEach(list::addAll);
答案 2 :(得分:10)
这是使用Java-9及更高版本的替代方法:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
答案 3 :(得分:4)
除了其他答案:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
这也可以解决问题。
答案 4 :(得分:2)
只需使用:-
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
答案 5 :(得分:2)
您可以将Collection.stream
与flatMap
结合使用:
Map<String, List<E>> map = new HashMap<>(); // program to interface
List<E> list = map.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
或使用非流版本:
List<E> list = new ArrayList<>();
map.values().forEach(list::addAll)
答案 6 :(得分:1)
您可以使用Collectors2.flatCollect
中的Eclipse Collections
List<String> list =
map.values().stream().collect(Collectors2.flatCollect(l -> l, ArrayList::new));
您还可以改编Map
并使用Eclipse Collections MutableMap
API。
List<String> list =
Maps.adapt(map).asLazy().flatCollect(l -> l).toList();
方法flatCollect
与方法flatMap
等效,除了flatCollect
采用Iterable
代替Stream
。
注意:我是Eclipse Collections的提交者。