Знаете, почему Collectors.toMap иногда завершается исключением?
Двухаргументный вариант подходит, когда ключи гарантированно уникальны. Если два объекта дают одинаковый ключ, сборщик не выбирает значение молча, а выбрасывает IllegalStateException.
Например, события могут повторять тип:
Map counts = events.stream()
.collect(Collectors.toMap(
Event::type, Event::id));
При повторе типа такой сбор завершится ошибкой. Для подсчёта задаём функцию объединения:
Map counts = events.stream()
.collect(Collectors.toMap(
Event::type, e -> 1L, Long::sum));
Long::sum вызывается только для повторного ключа, поэтому значения накапливаются. Такой вариант подходит для подсчёта событий, заказов или ошибок по категории.
Если вместо сводного значения нужно собрать объекты в группы, используем groupingBy:
Map byType = events.stream()
.collect(Collectors.groupingBy(Event::type));
Merge-функцию выбираем по смыслу данных, а не просто чтобы убрать исключение.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪