Java stream实现list转化为map
在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));
Reference
读后有收获,小礼物走一走,请作者喝咖啡。

作者:楼兰胡杨
本文版权归作者和博客园共有,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南