Collectors.toMap Duplicate key问题

简介: 使用集合toMap方法,遇到Duplicate key问题

发现问题:

  在开发中,简化代码使用JDK8特性stream流式操作,应用Collectors.toMap方法时,出现Duplicate key问题。

代码和异常

实际代码:

        Map<String,SecurityGroupResource>securityGroupMap = securityGroupResources.stream()
                    .collect(Collectors.toMap(SecurityGroupResource::getSgid,a->a));  

异常:image.png

分析

Duplicate key 重复key。我们知道,map里key是唯一的。此时toMap方法不清楚取前值还是后值,故抛出异常。

解决方法

1、保证list转map时,key唯一(不推荐,代码问题不要用业务去保证唯一)
2、给toMap方法确定覆盖还是不覆盖。

覆盖(取后值):

        Map<String,SecurityGroupResource> securityGroupMap = securityGroupResources.stream()
                    .collect(Collectors.toMap(SecurityGroupResource::getSgid,a->a,(V1,V2)->V1)));  

不覆盖(留前值):

        Map<String,SecurityGroupResource> securityGroupMap = securityGroupResources.stream()
                    .collect(Collectors.toMap(SecurityGroupResource::getSgid,a->a,(V1,V2)->V2))); 

3、业务场景如果相同key的值要全部保存,就用Map>去解决。
先遍历集合

        securityGroupResources.stream().collect(Collectors.toMap(SecurityGroupResource::getSgid,
            a -> Arrays.asList(a),
                        (List<String> oldList, List<String> newList) -> {
                oldList.addAll(newList);
                return oldList;
            }));
相关文章
|
缓存 Java 应用服务中间件
一文带你使用xxl-job定时任务
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。 因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
4830 0
一文带你使用xxl-job定时任务
|
7月前
|
Arthas 运维 监控
Arthas monitor(方法执行监控)
Arthas monitor(方法执行监控)
598 0
|
11月前
|
存储 关系型数据库 MySQL
从新手到高手:彻底掌握MySQL表死锁
通过本文的介绍,希望你能深入理解MySQL表死锁的概念、原因、检测方法及解决方案,并在实际开发中灵活应用这些知识,提升系统的稳定性和性能。
911 9
Java 集合List如何按照指定数量大小分割成多个List集合?
Java 集合List如何按照指定数量大小分割成多个List集合?
|
Java Maven
idea Maven Helper插件使用方法
idea Maven Helper插件使用方法
1958 0
idea Maven Helper插件使用方法
|
存储 索引
antd中table组件选中单行换样式(比如背景颜色)
在Ant Design (antd)的Table组件中,可以通过设置`onRow`属性来定义行点击事件,从而改变被点击行的样式,如背景颜色。`onRow`是一个函数,返回一个对象,对象包含事件处理函数,如`onClick`。同时,使用`rowClassName`属性来指定行的类名,结合状态管理,可以实现点击某行后改变其背景颜色的效果。具体实现时,需要在组件状态中保存当前被点击行的索引,然后通过`rowClassName`判断并返回相应的类名。
1367 2
antd中table组件选中单行换样式(比如背景颜色)
|
关系型数据库 MySQL
MySQL的between and 边界是什么?
【8月更文挑战第1天】MySQL的between and 边界是什么?
1339 0
|
存储 Java 关系型数据库
MyBatisPlus中的TypeHandler | 自定义字段类型转换Handler
MyBatisPlus中的TypeHandler | 自定义字段类型转换Handler
2268 0
|
SQL 数据处理 HIVE
【Hive】写出Hive中split、coalesce及collect_list函数的用法?
【4月更文挑战第17天】【Hive】写出Hive中split、coalesce及collect_list函数的用法?
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
3121 5