Java 8使用Collections toMap实现List转换为Map

时间:2022-06-01 19:35:30

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));
  }