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
实战小技巧9:List.subList使用不当StackOverflowError
相信每个小伙伴都使用过List.subList来获取子列表,日常使用可能没啥问题,但是,请注意,它的使用,很可能一不小心就可能导致StackOverflowError
607 0
|
10月前
|
Arthas 运维 监控
Arthas monitor(方法执行监控)
Arthas monitor(方法执行监控)
802 0
|
Java Maven
idea Maven Helper插件使用方法
idea Maven Helper插件使用方法
2168 0
idea Maven Helper插件使用方法
Java 集合List如何按照指定数量大小分割成多个List集合?
Java 集合List如何按照指定数量大小分割成多个List集合?
|
存储 索引
antd中table组件选中单行换样式(比如背景颜色)
在Ant Design (antd)的Table组件中,可以通过设置`onRow`属性来定义行点击事件,从而改变被点击行的样式,如背景颜色。`onRow`是一个函数,返回一个对象,对象包含事件处理函数,如`onClick`。同时,使用`rowClassName`属性来指定行的类名,结合状态管理,可以实现点击某行后改变其背景颜色的效果。具体实现时,需要在组件状态中保存当前被点击行的索引,然后通过`rowClassName`判断并返回相应的类名。
1586 2
antd中table组件选中单行换样式(比如背景颜色)
|
SQL 存储 数据库
数据库语言:DDL与DML详解
数据库语言:DDL与DML详解
5469 1
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
3581 5
|
SQL 人工智能 Java
mybatis-plus配置sql拦截器实现完整sql打印
_shigen_ 博主分享了如何在MyBatis-Plus中打印完整SQL,包括更新和查询操作。默认日志打印的SQL用?代替参数,但通过自定义`SqlInterceptor`可以显示详细信息。代码示例展示了拦截器如何替换?以显示实际参数,并计算执行时间。配置中添加拦截器以启用此功能。文章提到了分页查询时的限制,以及对AI在编程辅助方面的思考。
2688 5
mybatis-plus配置sql拦截器实现完整sql打印
|
SQL 机器学习/深度学习 XML
mybatis-plus分页查询详解
mybatis-plus分页查询详解
11256 0
mybatis-plus分页查询详解
|
easyexcel Java Apache
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
2073 0