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


版权声明:著作权归作者所有。

相关推荐

Java 9数组转换为List

Java 9使用List.of在Java 9,List新增了of()的工厂方法用来产生不可变的列表。返回一个空列表List list = List.of(); 多个元素生成列表List<Integer> list = List.of(1,2,3,4,5); 数组转换为列表Integer[] arr

Java 8使用Collectors.partitioningBy分割列表

有这样一个集合:List<Integer> integers = [ 1,2,3,4,5,6,7,8,9] 现在需要把集合按奇偶数分割为两个列表。这种情况下,我们可以使用Collectors.partitioningBy来分割:Map<Boolean, List<Integer>> map =

Java 8使用parallel Stream测试StringBuilder线程安全

我们知道StringBuilder不是线程安全的,但如何证明它非线程安全呢?测试StringBuilder是否线程安全一个简单的思路如下:模拟多个线程并发向StringBuilder实例添加字符,最后检测builder.toString().length()的值是否为添加字符的次数,如果非线程安全会出现builder.toString().length()的值与添加字符的次数不一致。Java&nb

Java8使用Lambda把List转换为Map

使用Java8的Collections可以很简便地把List转换为Map以User为例List里的User名字唯一Map<String, User> result =     users.stream().collect(Collectors.toMap(User::getName,   &nbs

Java 8 Stream API转换到Kotlin集合API

Kotlin提供的集合操作的API相对Java 8 Stream的API简洁很多。下面是Java 8 Stream API转换到Kotlin集合API。 映射属性聚合为列表// Java:   List<String> names = users.stream().m

TypeScript:字符串转换为数字

在TypeScript,String转换为Number有以下方式:Number构造函数(推荐)let n = Number('1234') // 1234 let nan = Number('abcd') // NaN +号操作符let n = +'1234'