Sobes.tech
Junior

Ce colectori de API Stream cunoști? Ce returnează groupingBy? Cu ce se deosebește de toMap? Cum se comportă toMap în cazul duplicatelor de chei?

sobes.tech AI

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

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