Collectors.toMap()
Сборщик, который строит словарь из элементов потока.
Доступно с: Java 8
Синтаксис
static <T, K, U> Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper)
static <T, K, U> Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| keyMapper | Function<? super T, ? extends K> | Получает ключ из элемента. |
| valueMapper | Function<? super T, ? extends U> | Получает значение из элемента. |
| mergeFunction | BinaryOperator<U> | Необязательно: что делать при повторе ключа. |
Возвращаемое значение
Collector<T, ?, Map<K, U>>Сборщик в словарь.
Примеры
Словарь «имя — длина»:
void main() {
Map<String, Integer> lengths = Stream.of("Anna", "Oleg", "Ivanka")
.collect(Collectors.toMap(n -> n, String::length));
IO.println(lengths.get("Ivanka"));
}Результат:
6Повтор ключа без функции слияния — ошибка:
void main() {
List<String> words = List.of("apple", "avocado", "banana");
try {
words.stream().collect(Collectors.toMap(w -> w.charAt(0), w -> w));
} catch (IllegalStateException e) {
IO.println(e.getMessage());
}
Map<Character, String> joined = words.stream()
.collect(Collectors.toMap(w -> w.charAt(0), w -> w, (a, b) -> a + "+" + b, TreeMap::new));
IO.println(joined);
}Результат:
Duplicate key a (attempted merging values apple and avocado)
{a=apple+avocado, b=banana}Примечания
Если два элемента дают один ключ, без третьего аргумента будет IllegalStateException: Duplicate key. Третий аргумент решает конфликт, четвёртый задаёт тип словаря (TreeMap::new, LinkedHashMap::new). Значение null не допускается — NullPointerException. Если нужно сгруппировать несколько элементов под одним ключом, используйте groupingBy().
См. также
- Collectors.groupingBy() — Сборщик, который раскладывает элементы по группам с общим ключом.
- HashMap — Словарь на основе хеш-таблицы: быстрый поиск по ключу, порядок не гарантирован.
- Map.merge() — Добавляет значение по ключу или объединяет его с уже существующим.
Вопросы и ответы по теме
В учебнике
- Коллекторы — Метод collect и класс Collectors — toList, toSet, toMap, joining, counting, summingInt, averagingDouble и ошибка повторяющегося ключа.