Sobes.tech
Back to questions
Junior
9

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

Companies where asked
ИП Ганус Александр Андреевич

Answer from 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)); // при дублировании ключа берём последнее значение

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