Как мне преобразовать Список <Entry>в Карту, где значением является список с использованием потоков? - PullRequest
0 голосов
/ 08 июня 2018

Как мне преобразовать List<Entry> в Map<Entry::getKey, List<Entry::getValue>>, используя потоки в Java 8?

Я не смог придумать хороший KeySelector для Collectors.toMap ():

List<Entry<Integer, String>> list = Arrays.asList(Entry.newEntry(1, "a"), Entry.newEntry(2, "b"), Entry.newEntry(1, "c"));
        Map<Integer, List<String>> map = list.stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));

Что я хочу получить: {'1': ["a", "c"], '2': ["b"]}.

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете сделать это, используя коллектор groupingBy вместе с mapping в качестве нисходящего коллектора:

myList.stream()
       .collect(groupingBy(e -> e.getKey(), mapping(e -> e.getValue(), toList())));

требуется импорт:

import static java.util.stream.Collectors.*;

Вы можетефактически достичь того же результата с помощью коллектора toMap:

 myList.stream()
       .collect(toMap(e -> e.getKey(), 
                 v -> new ArrayList<>(Collections.singletonList(v.getValue())),
              (left, right) -> {left.addAll(right); return left;}));

, но это не идеально, когда вы можете использовать коллектор groupingBy и он менее читабелен для IMO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...