如何优雅的实现将Collection转为Map

 更新时间:2025年03月25日 09:45:13   作者:付聪1210  
这篇文章主要介绍了如何优雅的实现将Collection转为Map,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

将Collection转换为Map是常见的需求,尤其是在处理数据时需要快速查找或去重。

以下是几种常见的方法,包括使用谷歌的Maps.uniqueIndex、Hutool的CollUtil.toMap和Java Stream API的Collectors.toMap三种方法。

谷歌的Maps.uniqueIndex

/**
 * 使用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

/**
 * 使用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.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));

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Log4j关闭Spring和Hibernate日志打印方式

    Log4j关闭Spring和Hibernate日志打印方式

    这篇文章主要介绍了Log4j关闭Spring和Hibernate日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中的内存模型JMM详细解读

    Java中的内存模型JMM详细解读

    这篇文章主要介绍了Java中的内存模型JMM详细解读,Java 对内存的抽象模型如下,每个线程都有一块自己的私有内存(也称为工作内存),当线程使用变量时,会把主内存里面的变量复制到工作内存,线程读写变量时操作的是自己工作内存中的变量,需要的朋友可以参考下
    2023-12-12
  • 阿里面试Nacos配置中心交互模型是push还是pull原理解析

    阿里面试Nacos配置中心交互模型是push还是pull原理解析

    这篇文章主要为大家介绍了阿里面试Nacos配置中心交互模型是push还是pull原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • IDEA2021没有Web Application的解决过程及分析

    IDEA2021没有Web Application的解决过程及分析

    在IDEA中创建WebApplication项目时,若AddFrameworksSupport无该选项,可先创建普通Java项目后添加框架支持,或通过快捷键打开registry,勾选javaee.legacy.project.wizard以启用,如解决您的问题,欢迎点赞支持
    2025-09-09
  • IDEA中HTML通过servlet3.0注解名提交表单到servlet类找不到页面的问题

    IDEA中HTML通过servlet3.0注解名提交表单到servlet类找不到页面的问题

    这篇文章主要介绍了IDEA中HTML通过servlet3.0注解名提交表单到servlet类找不到页面的问题,本文通过场景描述及问题解析,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • JAVA时间存储类Period和Duration使用详解

    JAVA时间存储类Period和Duration使用详解

    这篇文章主要为大家介绍了JAVA时间存储类Period和Duration使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 深入java事件注册的应用分析

    深入java事件注册的应用分析

    本篇文章是对java事件注册进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Springboot开发OAuth2认证授权与资源服务器操作

    Springboot开发OAuth2认证授权与资源服务器操作

    这篇文章主要介绍了Springboot开发OAuth2认证授权与资源服务器操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring中的@Scope注解详细讲解及示例

    Spring中的@Scope注解详细讲解及示例

    这篇文章主要介绍了Spring中的@Scope注解详细讲解及示例,@Scope注解是 Spring IOC 容器中的一个作用域,在 Spring IOC 容器中,他用来配置Bean实例的作用域对象,需要的朋友可以参考下
    2023-11-11
  • java递归算法实例分析

    java递归算法实例分析

    这篇文章主要介绍了java递归算法实例分析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论