Метод toMap
Метод toMap класса Collectors собирает элементы
потока в коллекцию типа Map. В первый параметр мы передаем
функцию, которая извлекает ключ из элемента. Во второй параметр
мы передаем функцию, которая извлекает значение из элемента.
В третий параметр мы передаем функцию слияния, которая решает
конфликт, когда два элемента дают одинаковый ключ. В четвертый
параметр мы передаем фабрику, создающую конкретную реализацию
Map, например TreeMap.
Первые два параметра обязательны, а функция слияния и фабрика
Map - необязательны. Если дубликаты ключей возможны,
а функция слияния не задана, метод выбрасывает исключение
IllegalStateException.
Синтаксис
Collectors.toMap(keyMapper, valueMapper)
Collectors.toMap(keyMapper, valueMapper, mergeFunction)
Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapFactory)
Пример
Давайте соберем список чисел в Map, где ключом будет
само число, а значением - его квадрат:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Map<Integer, Integer> res = list.stream()
.collect(Collectors.toMap(
n -> n,
n -> n * n
));
System.out.println(res);
}
}
Результат выполнения кода:
{1=1, 2=4, 3=9, 4=16, 5=25}
Пример
Давайте соберем список строк в Map, где ключом будет
строка, а значением - ее длина:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "abc", "ab");
Map<String, Integer> res = list.stream()
.collect(Collectors.toMap(
s -> s,
s -> s.length()
));
System.out.println(res);
}
}
Результат выполнения кода:
{abcde=5, abc=3, ab=2}
Пример
Если два элемента дают одинаковый ключ, нужно передать функцию слияния. Давайте при дубликате ключа оставим последнее значение:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("ab", "abc", "ab");
Map<String, Integer> res = list.stream()
.collect(Collectors.toMap(
s -> s,
s -> s.length(),
(oldValue, newValue) -> newValue
));
System.out.println(res);
}
}
Результат выполнения кода:
{ab=2, abc=3}
Пример
Четвертым параметром можно задать конкретную реализацию Map.
Давайте соберем результат в TreeMap, чтобы ключи были
отсортированы:
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(3, 1, 2, 5, 4);
Map<Integer, Integer> res = list.stream()
.collect(Collectors.toMap(
n -> n,
n -> n * n,
(oldValue, newValue) -> newValue,
TreeMap::new
));
System.out.println(res);
}
}
Результат выполнения кода:
{1=1, 2=4, 3=9, 4=16, 5=25}
Смотрите также
-
метод
toList,
который собирает элементы потока в список -
метод
toSet,
который собирает элементы потока в множество -
метод
groupingBy,
который группирует элементы по ключу -
класс
Collectors,
который содержит методы для сбора элементов потока