Java 8使用Collections toMap实现List转换为Map
Collections提供了toMap()来实现集合转换为Map。
方法如下:
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper)
keyMapper:实现键的映射的函数
valueMapper:实现值的映射的函数
1、List转换为Map
现把一个用户列表List<User>转换为以name为键,User对象为值的示例:
public Map<String, User> listToMap(List<User> users) {
return users.stream().collect(Collectors.toMap(User::getName, Function.identity()));
}
其中Function.identity()表示User对象本身。
2、解决Key冲突
如果集合中用作key的值存在重复,使用toMap()转换时会抛出IllegalStateException异常。如示例中,会存在重名的用户。
Collections提供了三个参数的toMap()方法,方法如下:
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
其中mergeFunction会接收冲突键的值,然后根据需求合并冲突键的值并返回。
如上面示例中,如果存在重复的用户名,其他重名的用户被忽略的实现如下:
public Map<String, User> listToMapWithDupKey(List<User> users) {
return users.stream().collect(Collectors.toMap(User::getName, Function.identity(),
(existing, replacement) -> existing));
}
3、返回其他类型的Map
默认情况下,toMap()方法将返回一个HashMap。 但是我们也可以返回不同的Map实现。在原来toMap()方法上添加了Supplier参数,。
方法如下:
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier)
其中mapSupplier是一个函数,它返回一个新的、带有结果的空Map,后续就会使用此Map来装载转换的值。
转换为ConcurrentMap
public Map<String, User> listToConcurrentMap(List<User> books) {
return users.stream().collect(Collectors.toMap(User::getName, Function.identity(),
(o1, o2) -> o1, ConcurrentHashMap::new));
}