Collectors.groupingBy()
Сборщик, который раскладывает элементы по группам с общим ключом.
Доступно с: Java 8
Синтаксис
static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier)
static <T, K, A, D> Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| classifier | Function<? super T, ? extends K> | Вычисляет ключ группы для элемента. |
| downstream | Collector<? super T, A, D> | Необязательно: что собрать внутри каждой группы (по умолчанию список). |
Возвращаемое значение
Collector<T, ?, Map<K, D>>Сборщик в словарь групп.
Примеры
Слова по длине:
void main() {
Map<Integer, List<String>> byLength = Stream.of("cat", "dog", "horse", "ox", "mouse")
.collect(Collectors.groupingBy(String::length));
IO.println(byLength);
}Результат:
{2=[ox], 3=[cat, dog], 5=[horse, mouse]}Сумма по категориям в отсортированном словаре:
record Expense(String category, int amount) {}
void main() {
var expenses = List.of(new Expense("food", 30), new Expense("transport", 15),
new Expense("food", 12), new Expense("fun", 40));
Map<String, Integer> totals = expenses.stream()
.collect(Collectors.groupingBy(Expense::category, TreeMap::new,
Collectors.summingInt(Expense::amount)));
IO.println(totals);
}Результат:
{food=42, fun=40, transport=15}Примечания
По умолчанию результат — HashMap, где значение — список элементов группы. Второй аргумент меняет содержимое группы: counting(), summingInt(), averagingDouble(), mapping(), toSet(). Версия с тремя аргументами задаёт тип словаря, например TreeMap::new для отсортированных ключей.
См. также
- Collectors.counting() — Сборщик-счётчик; обычно используется внутри `groupingBy()`.
- Collectors.partitioningBy() — Делит элементы потока на две группы по условию.
- Collectors.toMap() — Сборщик, который строит словарь из элементов потока.
- Map.computeIfAbsent() — Возвращает значение по ключу, создавая его функцией, если ключа нет.
Вопросы и ответы по теме
- Как найти дубликаты в списке
- Как поменять местами ключи и значения в Map
- Как посчитать количество повторений элементов
- Как посчитать слова в строке
- Как посчитать элементы по значениям enum
- Как превратить список в Map
- Как разбить список на части
- Как разделить список на две части по условию
- Как сгруппировать список по полю
В учебнике
- Группировка — Группировка элементов потока в Java — Collectors.groupingBy, подсчёт и суммы по группам, mapping, TreeMap и partitioningBy.