如何优雅地将Collection转为Map?

ops/2025/3/17 12:33:24/

将Collection转换为Map是常见的需求,尤其是在处理数据时需要快速查找或去重。以下是几种常见的方法,包括使用谷歌的Maps.uniqueIndex、Hutool的CollUtil.toMap和Java Stream API的Collectors.toMap三种方法。

谷歌的Maps.uniqueIndex

java">/*** 使用com.google.common.collect.Maps#uniqueIndex(java.lang.Iterable, com.google.common.base.Function)方法** @author 付聪* @time 2025-03-13 09:29:51*/
@Test
public void testGoogleMapsUniqueIndex() {User user1 = new User();user1.setId(1);user1.setName("张三");User user2 = new User();user2.setId(2);user2.setName("李四");User user3 = new User();// 重复id(2)user3.setId(2);user3.setName("王五");List<User> userList = CollUtil.newArrayList();userList.add(user1);userList.add(user2);//userList.add(user3);Set<User> userSet = CollUtil.newHashSet();userSet.add(user1);userSet.add(user2);//userSet.add(user3);// 如果key重复,会报异常。Map<Integer, User> userListMap = Maps.uniqueIndex(userList, user -> user.getId());System.out.println(StrUtil.format("userListMap是:{}", userListMap.toString()));Map<Integer, User> userSetMap = Maps.uniqueIndex(userSet, user -> user.getId());System.out.println(StrUtil.format("userSetMap是:{}", userSetMap.toString()));}
———————————————————————— 开始测试单个方法 ————————————————————————userListMap是:{1=User(id=1, name=张三, remark=null), 2=User(id=2, name=李四, remark=null)}
userSetMap是:{1=User(id=1, name=张三, remark=null), 2=User(id=2, name=李四, remark=null)}———————————————————————— 结束测试单个方法 ————————————————————————

注意:如果key重复,会报异常。

Hutool的CollUtil.toMap

java">/*** 使用cn.hutool.core.collection.CollUtil#toMap(java.lang.Iterable, java.util.Map, cn.hutool.core.lang.func.Func1, cn.hutool.core.lang.func.Func1)** @author 付聪* @time 2025-03-12 09:29:35*/
@Test
public void testHutoolCollUtilToMap() {User user1 = new User();user1.setId(1);user1.setName("张三");User user2 = new User();user2.setId(2);user2.setName("李四");User user3 = new User();// 重复id(2)user3.setId(2);user3.setName("王五");List<User> userList = CollUtil.newArrayList();userList.add(user1);userList.add(user2);userList.add(user3);Set<User> userSet = CollUtil.newHashSet();userSet.add(user1);userSet.add(user3);userSet.add(user2);// 如果key重复,会取其中一个,具体哪一个,我暂不确定。Map<Integer, User> userListMap = CollUtil.toMap(userList, MapUtil.newHashMap(), user -> user.getId(), user -> user);System.out.println(StrUtil.format("userListMap是:{}", userListMap.toString()));// 如果key重复,会取其中一个,具体哪一个,我暂不确定。Map<Integer, User> userSetMap = CollUtil.toMap(userSet, MapUtil.newHashMap(), user -> user.getId(), user -> user);System.out.println(StrUtil.format("userSetMap是:{}", userSetMap.toString()));}
———————————————————————— 开始测试单个方法 ————————————————————————userListMap是:{1=User(id=1, name=张三, remark=null), 2=User(id=2, name=王五, remark=null)}
userSetMap是:{1=User(id=1, name=张三, remark=null), 2=User(id=2, name=王五, remark=null)}———————————————————————— 结束测试单个方法 ————————————————————————

注意:如果key重复,会取其中一个,具体哪一个,我暂不确定。

Java Stream API的Collectors.toMap

java">/*** 使用java.util.stream.Collectors#toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator)** @author 付聪* @time 2025-03-12 09:29:35*/
@Test
public void testJavaStreamAPICollectorsToMap() {User user1 = new User();user1.setId(1);user1.setName("张三");User user2 = new User();user2.setId(2);user2.setName("李四");User user3 = new User();// 重复id(2)user3.setId(2);user3.setName("王五");List<User> userList = CollUtil.newArrayList();userList.add(user1);userList.add(user2);userList.add(user3);Set<User> userSet = CollUtil.newHashSet();userSet.add(user1);userSet.add(user2);userSet.add(user3);// 如果key重复,会报异常。//Map<Integer, User> userListMap1 = userList.stream().collect(Collectors.toMap(user -> user.getId(), user -> user));//System.out.println(StrUtil.format("userListMap1是:{}", userListMap1.toString()));// (key1, key2) -> key1:如果key重复,取第一个。Map<Integer, User> userListMap2 = userList.stream().collect(Collectors.toMap(user -> user.getId(), user -> user, (key1, key2) -> key1));System.out.println(StrUtil.format("userListMap2是:{}", userListMap2.toString()));// 如果key重复,会报异常。//Map<Integer, User> userSetMap1 = userSet.stream().collect(Collectors.toMap(user -> user.getId(), user -> user));//System.out.println(StrUtil.format("userSetMap1是:{}", userSetMap1.toString()));// (key1, key2) -> key2:如果key重复,取第二个。Map<Integer, User> userSetMap2 = userSet.stream().collect(Collectors.toMap(user -> user.getId(), user -> user, (key1, key2) -> key2));System.out.println(StrUtil.format("userSetMap2是:{}", userSetMap2.toString()));}
———————————————————————— 开始测试单个方法 ————————————————————————userListMap2是:{1=User(id=1, name=张三, remark=null), 2=User(id=2, name=李四, remark=null)}
userSetMap2是:{1=User(id=1, name=张三, remark=null), 2=User(id=2, name=王五, remark=null)}———————————————————————— 结束测试单个方法 ————————————————————————

区别对比

是否支持处理重复key如果key重复会怎样
谷歌的Maps.uniqueIndex报错
Hutool的CollUtil.toMap取其中一个
Java Stream API的Collectors.toMap可根据合并函数取值

其他说明

如果不存在将多个字段值拼接成key的情况,也可以把【user -> user.getId()】改为【User::getId】,但是如果存在将多个字段值拼接成key的情况,就可以使用【->】的形式进行拼接。

Map<String, User> userListMap2 = userList.stream().collect(Collectors.toMap(user -> StrUtil.format("{}_{}", user.getId(), user.getName()), user -> user, (key1, key2) -> key1));

http://www.ppmy.cn/ops/166491.html

相关文章

OSPF | LSDB 链路状态数据库 / SPF 算法 / 实验

注&#xff1a;本文为 “OSPF | LSDB / SPF ” 相关文章合辑。 LSDB 和 SPF 算法 潇湘浪子的蹋马骨汤 发布 2019-02-15 23:58:46 1. 链路状态数据库 (LSDB) 链路状态协议除了执行洪泛扩散链路状态通告&#xff08;LSA&#xff09;以及发现邻居等任务外&#xff0c;其第三个任…

电子电气架构 --- 智能电动汽车的品牌竞争转变

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 人生是一场骗局&#xff0c;最大的任务根本不是什么买车买房&#xff0c;也不是及时行乐&#xff0c;这就…

.NET Framework华为云流水线发布

文章目录 前言一、新建代码检查二、新建编译构建三、新建部署三、新建流水线 前言 华为云流水线发布&#xff1a;自动检查代码&#xff0c;打包发布到服务器 一、新建代码检查 检查代码是否存在报错 设置规则集 二、新建编译构建 三、新建部署 模板选择空模板或者自己去创建…

Kubernetes的组成和架构

Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它由多个组件组成&#xff0c;这些组件可以分为两类&#xff1a;控制平面&#xff08;Control Plane&#xff09;组件和节点&#xff08;Node&#xff0…

Sublime Text 2.0.2 安装与汉化指南:从下载到中文包配置的完整教程

Sublime Text 是一款轻量级、高性能的代码编辑器&#xff0c;深受开发者喜爱。Sublime Text 2.0.2 是一个较旧的版本&#xff0c;但仍然可以满足基本的代码编辑需求。以下是关于 Sublime Text 2.0.2 的安装、中文包配置以及使用方法的详细指南。 1. 下载 Sublime Text 2.0.2 提…

使用OpenCV和MediaPipe库——抽烟检测(姿态监控)

目录 抽烟检测的运用 1. 安全监控 (1) 公共场所禁烟监管 (2) 工业安全 2. 智能城市与执法 (1) 城市违章吸烟检测 (2) 无人值守管理 3. 健康管理与医疗 (1) 吸烟习惯分析 (2) 远程监护 4. AI 监控与商业分析 (1) 保险行业 (2) 商场营销 5. 技术实现 (1) 计算机视…

图论的基础知识:平凡图、简单图、连通图、平面图、完全图、对偶图、同构图

一、平凡图 平凡图是图论中最简单的图&#xff0c;其定义如下&#xff1a; 平凡图&#xff08;Trivial Graph&#xff09;&#xff1a;仅包含一个顶点且没有任何边的图。 也就是说&#xff0c;一个平凡图满足&#xff1a; 顶点集合 ( V ) 的大小为 1&#xff08;即 (|V| 1…

VS2022输入 scanf 报错解决方法

1.第一种解决办法&#xff08;不推荐&#xff09; •将 scanf 替换为 scanf_s •scanf_s 是VS提供的一个函数&#xff0c;scanf_s函数的使用和scanf是有区别的 •scanf_s 是VS提供的一个函数&#xff0c;其他的编译器可能不认识这个函数&#xff0c;那么我们所写的代码就存在跨…