Как получить список <E> из HashMap <String, List<E >>
Я хочу извлечь 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
Ответы
Ответ 1
map.values()
возвращает Collection<List<E>>
не List<E>
, если вы хотите последний, вам нужно сгладить вложенный List<E>
в один List<E>
следующим образом:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
Ответ 2
Или используйте для forEach
map.forEach((k,v)->list.addAll(v));
или, как прокомментировал Аомин, используйте это
map.values().forEach(list::addAll);
Ответ 3
Вот альтернативный способ сделать это с Java-9 и выше:
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
Ответ 4
В дополнение к другим ответам:
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)
Ответ 6
Просто используйте: -
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
Ответ 7
Вы можете использовать Collectors2.flatCollect
из Collectors2.flatCollect
Eclipse.
List<String> list =
map.values().stream().collect(Collectors2.flatCollect(l -> l, ArrayList::new));
Вы также можете адаптировать Map
и использовать API Eclipse Collections MutableMap
.
List<String> list =
Maps.adapt(map).asLazy().flatCollect(l -> l).toList();
Метод flatCollect
эквивалентен методу flatMap
, за исключением того, что flatCollect
принимает Iterable
вместо Stream
.
Примечание: я являюсь коммиттером для Eclipse Collections.