在Stream流中将List转换为Map,是使用Collectors.toMap方法来进行转换。
- key和value都是对象中的某个属性值。
Map<String, String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId, User::getName));
- 使用箭头函数
Map中,key是对象中的某个属性值,value是对象本身。
Map<String, User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId, User -> User));
- 使用Lambda表达式
key是对象中的某个属性值,value是对象本身(使用Function.identity()的简洁写法)。
Map<String, User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
- 处理重复的key
key是对象中的某个属性值,value是对象本身,当key冲突时选择第二个key值覆盖第一个key值。
Map<String, User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (oldValue, newValue) -> newValue));
如果不正确指定Collectors.toMap方法的第三个参数(key冲突处理函数),那么在key重复的情况下该方法会报出【Duplicate Key】的错误导致Stream流异常终止,使用时要格外注意这一点。当然,也可以使用第一个key覆盖第二个key。
- 转换成TreeMap
public static void main(String[] args) {
//将List转换为Map,解决key冲突的问题
TreeMap<String,String> collect = users.stream().
//User对象的id属性作为key,但是key相同时,使用旧的value值
collect(Collectors.toMap(User::getId, User::getName,
(k1, k2) -> k1, TreeMap::new
));
System.out.println(collect);
}
如果把TreeMap改为LinkedHashMap,就可以转换成LinkedHashMap。
- 以某个属性分组
主要用于对相同key值的数据进行合并,例如统计各个部门的员工名单时,就要把全部员工list转换成以部门维度汇总的map。示例以部门ID进行分组,相同ID 的员工映射到同一个ID:
Map<String, List<User>> map = list.stream().collect(Collectors.groupingBy(User::getDepartmentId));