Получить набор значений карты при использовании 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()
позвоните внутрь коллектора.