Используйте Collectors.groupingby, чтобы создать карту для набора - PullRequest
0 голосов
/ 25 февраля 2019

Я знаю, как создать Map<T, List<U>>, используя Collectors.groupingBy:

Map<Key, List<Item>> listMap = items.stream().collect(Collectors.groupingBy(s->s.key));

Как мне изменить этот код для создания Map<Key, Set<Item>>?Или я не могу сделать это с помощью stream и поэтому приходится создавать его вручную с помощью цикла for и т. Д .?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Вы должны использовать нижестоящий коллектор, как этот:

Map<Key, Set<Item>> listMap = items.stream()
    .collect(Collectors.groupingBy(s -> s.key, Collectors.toSet()));
0 голосов
/ 25 февраля 2019

Мне также иногда нравится не потоковое решение:

 Map<Key, Set<Item>> yourMap = new HashMap<>();
 items.forEach(x -> yourMap.computeIfAbsent(x.getKey(), ignoreMe -> new HashSet<>()).add(x));

Если вы действительно хотите, вы можете попробовать сделать то же самое с помощью compute/merge методов тоже

0 голосов
/ 25 февраля 2019

Используйте Collectors.toSet() в качестве нисходящего потока в groupingBy :

Map<Key, Set<Item>> map = items.stream()
            .collect(Collectors.groupingBy(s -> s.key, Collectors.toSet()));
...