如何从HashMap <string,list <e >>

时间:2019-01-05 17:31:21

标签: java collections java-8 java-stream collectors

我想使用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

7 个答案:

答案 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.streamflatMap结合使用:

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的提交者。