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)); // при дублировании ключа берём последнее значение
Без функции слияния дублирование ключей приведёт к ошибке.