Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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)

Параметры

ПараметрТипОписание
classifierFunction<? super T, ? extends K>Вычисляет ключ группы для элемента.
downstreamCollector<? 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() — Возвращает значение по ключу, создавая его функцией, если ключа нет.

Вопросы и ответы по теме

В учебнике

  • Группировка — Группировка элементов потока в Java — Collectors.groupingBy, подсчёт и суммы по группам, mapping, TreeMap и partitioningBy.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.