Как получить список & lt; E & gt; из HashMap & lt; String, List & lt; E & gt; & gt;

Я хочу извлечь 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

15

Решение

map.values() возвращает Collection<List<E>> не List<E>, если вы хотите последнее, то вы должны сгладить вложенный List<E> в один List<E> следующее:

List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
25

Другие решения

Или использовать forEach

 map.forEach((k,v)->list.addAll(v));

или, как прокомментировал Аомин, используйте это

map.values().forEach(list::addAll);
10

Вот альтернативный способ сделать это с Java-9 и выше:

List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
8

В дополнение к другим ответам:

List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);

Это также может помочь.

5

Ты можешь использовать 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)
4

Просто используйте: —

map.values().stream().flatMap(List::stream).collect(Collectors.toList());
2