Как получить список <E>из HashMap <String, List <E>> - PullRequest
0 голосов
/ 05 января 2019

Я хочу извлечь 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 голосов
/ 05 января 2019

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

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

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

0 голосов
/ 27 января 2019

Вы можете использовать Collectors2.flatCollect из Коллекции Eclipse

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.

0 голосов
/ 05 января 2019

Или используйте forEach

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

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

map.values().forEach(list::addAll);
0 голосов
/ 05 января 2019

Вы можете использовать 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)
0 голосов
/ 05 января 2019

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

map.values().stream().flatMap(List::stream).collect(Collectors.toList());
0 голосов
/ 05 января 2019

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

List<E> result = map.values()
                    .stream()
                    .collect(Collectors.flatMapping(List::stream, Collectors.toList()));
0 голосов
/ 05 января 2019

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

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