Java Stream API : 什么样的map方法collect(Collectors.toMap()) returns?
Java Stream API : what kind of map method collect(Collectors.toMap()) returns?
"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<>();
不,初始化 hm
引用的变量毫无意义,因为流管道会创建一个新的 Map
实例,然后您将其分配给 hm
.
实际返回的 Map
实现是一个实现细节。目前它默认 returns HashMap
,但您可以通过使用 toMap()
.
的不同变体来请求特定的 Map
实现
您可以在此处查看一种实现方式:
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()
returns一个ArrayList
和toSet
一个HashSet
(至少在Java 8),但是那可以未来版本中的更改,因为它不是合同的一部分。
"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<>();
不,初始化 hm
引用的变量毫无意义,因为流管道会创建一个新的 Map
实例,然后您将其分配给 hm
.
实际返回的 Map
实现是一个实现细节。目前它默认 returns HashMap
,但您可以通过使用 toMap()
.
Map
实现
您可以在此处查看一种实现方式:
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()
returns一个ArrayList
和toSet
一个HashSet
(至少在Java 8),但是那可以未来版本中的更改,因为它不是合同的一部分。