Нет, инициализация переменной, на которую ссылается 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), но это может измениться в будущих версиях, поскольку это не является частью контракта.