Sobes.tech
Junior

¿Qué colecciones de la API Stream conoces? ¿Qué devuelve groupingBy? ¿En qué se diferencia de toMap? ¿Cómo se comporta toMap con claves duplicadas?

sobes.tech AI

Respuesta de la IA

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

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