Получить набор значений карты при использовании Collectors.groupingBy()

У меня есть Collection<A> что я хочу сгруппировать по типу. Я могу получить тип А через getType метод. Результат должен быть типа Collection<Collection<A>>, Например:
Входные данные: [A1 ,A2, A3, A1, A3, A4] (A1 - это объект типа "1" и т. Д.)
Выход: [[A1, A1], [A2], [A3, A3], [A4]]

Вот что я написал:listOfAs.stream().collect(Collectors.groupingBy(SomeClass::getType)).values();

Есть ли способ, которым я могу напрямую получить набор значений сгенерированной карты вместо генерации карты и последующего извлечения набора значений из нее, используя values()?

1 ответ

Решение

Ну, внутренне вам все еще нужно будет создать такую ​​карту. Можно создать собственный коллектор, хотя:

public static <T, K> 
Collector<T, ?, Collection<List<T>>> groups(Function<? super T, ? extends K> classifier) {
    return Collectors.collectingAndThen(Collectors.groupingBy(classifier), Map::values);
}

Так что вы можете использовать это так:

Collection<List<SomeClass>> result = listOfAs.stream().collect(groups(SomeClass::getType));

Обратите внимание, что внутренне это не сильно отличается от вашего решения. Вы просто включаете values() позвоните внутрь коллектора.

Другие вопросы по тегам