如何从HashMap <String,List <E >>获取List <E>

Yas*_*ida 24 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
Run Code Online (Sandbox Code Playgroud)

Ous*_* D. 33

map.values()返回a Collection<List<E>>不是a List<E>,如果你想要后者那么你需要将嵌套展平List<E>为单个List<E>,如下所示:

List<E> result = map.values()
                    .stream()
                    .flatMap(List::stream)
                    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Had*_*i J 14

或者使用 forEach

 map.forEach((k,v)->list.addAll(v));
Run Code Online (Sandbox Code Playgroud)

或者如Aomine所评论的那样使用它

map.values().forEach(list::addAll);
Run Code Online (Sandbox Code Playgroud)


Rav*_*ala 10

以下是使用Java-9及更高版本的另一种方法:

List<E> result = map.values()
                    .stream()
                    .collect(Collectors.flatMapping(List::stream, Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

  • 它确实降低了这里的可读性.Java 8方式在这里显然更具相关性. (9认同)
  • 只是apiNote: - *`flatMapping()`收集器在用于多级缩减*时最有用,例如`groupingBy`或`partitioningBy`的下游. (6认同)