Sobes.tech
Junior
24

Какие коллекторы Stream API знаешь? Что возвращает groupingBy? Чем отличается от toMap? Как toMap ведёт себя при дублях ключей?

Сұралған компаниялар
ИП Ганус Александр Андреевич

AI-дан жауап

sobes.tech AI

В Stream API Java есть несколько стандартных коллекторов, например:

  • toList() — собирает элементы в список.
  • toSet() — собирает элементы в множество.
  • toMap() — собирает элементы в карту (Map).
  • groupingBy() — группирует элементы по ключу, возвращая Map с ключами и списками значений.
  • joining() — объединяет строки.
  • summarizingInt() и подобные — собирают статистику.

groupingBy возвращает Map<K, List<V>>, где ключ — результат функции классификации, а значение — список элементов, попавших в эту группу.

Отличие groupingBy от toMap в том, что toMap создаёт Map, где каждому ключу соответствует ровно одно значение, а groupingBy группирует несколько элементов под одним ключом в коллекцию.

При использовании toMap с дублирующимися ключами по умолчанию выбрасывается IllegalStateException. Чтобы избежать этого, можно передать третий параметр — функцию слияния значений, например:

Map<String, String> map = list.stream()
    .collect(Collectors.toMap(
        item -> item.getKey(),
        item -> item.getValue(),
        (v1, v2) -> v2)); // при дублировании ключа берём последнее значение

Без функции слияния дублирование ключей приведёт к ошибке.