Назад к вопросам
Junior
10
Какие коллекторы Stream API знаешь? Что возвращает groupingBy? Чем отличается от toMap? Как toMap ведёт себя при дублях ключей?
Компании, где спрашивали
ИП Ганус Александр Андреевич
Ответ от нейросети
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)); // при дублировании ключа берём последнее значение
Без функции слияния дублирование ключей приведёт к ошибке.