API Java Stream: какой метод карты возвращает метод Collectors.toMap ()? - PullRequest
2 голосов
/ 25 июня 2019

Что за карта "хм"?

 Map<String,Person> hm;

    try (BufferedReader br = new BufferedReader(new FileReader("person.txt")) {
        hm = br.lines().map(s -> s.split(","))
               .collect(Collectors.toMap(a -> a[0] , a -> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3]))));

Зависит ли она от декларации?

Map<String,Person> hm = new HashMap<>();
Map<String,Person> hm = new TreeMap<>();

1 Ответ

4 голосов
/ 25 июня 2019

Нет, инициализация переменной, на которую ссылается hm, не имеет смысла, поскольку потоковый конвейер создает новый экземпляр Map, который затем назначается для hm.

Фактически возвращенная реализация Mapэто деталь реализации.В настоящее время он возвращает HashMap по умолчанию, но вы можете запросить конкретную реализацию Map, используя другой вариант toMap().

Вы можете увидеть одну реализацию здесь:

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper) {
    return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}

Вы можете видеть, что он передает ссылку на метод в конструктор HashMap, что означает, что будет создан экземпляр HashMap.Если вы вызываете 4 аргумента toMap вариант, вы можете контролировать тип возвращаемой реализации Map.

Аналогично, toList() возвращает ArrayList и toSet a HashSet (по крайней мере, в Java 8), но это может измениться в будущих версиях, поскольку это не является частью контракта.

...