Я хочу извлечь 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
map.values()
возвращает Collection<List<E>>
не List<E>
, если вы хотите последнее, то вы должны сгладить вложенный List<E>
в один List<E>
следующее:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
Или использовать forEach
map.forEach((k,v)->list.addAll(v));
или, как прокомментировал Аомин, используйте это
map.values().forEach(list::addAll);
Вот альтернативный способ сделать это с Java-9 и выше:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
В дополнение к другим ответам:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
Это также может помочь.
Ты можешь использовать 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)
Просто используйте: —
map.values().stream().flatMap(List::stream).collect(Collectors.toList());