“ hm”是什么样的地图?
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<>();
答案 0 :(得分:4)
否,初始化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
一个HashSet
(至少在Java 8中),但是在以后的版本中可能会改变,因为它不属于合同。