一、普通for循环

Map<Integer,String> userMap = new HashMap<>();
for (User user : userList) {
    userMap.put(user.getAge(),user.getName());
}

二、使用Collectors.toMap

1.key和value都是对象中的某个属性值

Map<Integer, String> userMap = userList.stream().collect(Collectors.toMap(User::getAge, User::getName));

2.key是对象中的某个属性值,value是对象本身

(1).方式一

Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getAge, user ->user));

(2).方式二

Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getAge, Function.identity()));

3.特殊情况处理

Collectors.toMap使用中需要注意以下情况,仅针对

Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper)
  1. key可以为null,value不能为null

  2. key不能出现重复值,value可以重复

(1).key重复

// 当key冲突时选择第一个key值覆盖后续值
Map<Integer, String> userMap = userList.stream().collect(Collectors.toMap(User::getAge, User::getName,(oldValue, newValue) -> oldValue));
​
// 当key冲突时选择第二个key值覆盖第一个key值
Map<Integer, String> userMap = userList.stream().collect(Collectors.toMap(User::getAge, User::getName,(oldValue, newValue) -> newValue));

(2).value为null

// 手动设置默认值
Map<Integer, String> userMap = userList.stream().collect(Collectors.toMap(User::getAge, user -> user.getName() == null ? "" : user.getName()));
​
// 使用Optional包装
Map<Integer, String> userMap = userList.stream().collect(Collectors.toMap(User::getAge,user-> Optional.ofNullable(user.getName()).orElse(""));
                                                         
// 使用Optional包装
Map<Integer, String> userMap = userList.stream().collect(Collectors.toMap(User::getAge,user-> Optional.ofNullable(user.getName()).orElse(""));
                                                         
//自定义map
Map<Integer, String> userMap = userList.stream().collect(Collectors.toMap(User::getAge, User::getName,(oldValue, newValue) -> oldValue,TreeMap::new));
                                                         
//collect中手动实现map返回
Map<Integer, String> userMap = userList.stream().collect(HashMap::new, (k, v) -> k.put(v.getAge(), v.getName()), HashMap::putAll));
​

三、使用Collectors.toConcurrentMap

Collectors.toConcurrentMap具有更好的并发性能,但是无需

具体使用方法和Collectors.toMap相同

四、使用Collectors.groupingBy

Map<Integer, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getAge));
​

五、使用Collectors.partitioningBy

partitioningBy() 可以理解为特殊的 groupingBy() ,key 值为 Boolean类型

Map<Boolean, List<User>> userMap = userList.stream().collect(Collectors.partitioningBy(user -> user.getAge() >= 20));
​