一、普通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)
key可以为null,value不能为null
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));