Java8 Duplicate key 异常解决

Java8 dubbo 调用 Collectors.toMap代码片发生的异常(IllegalStateException: Duplicate key) 事故现场代码 Map1 map = list.stream().collect( Collectors.toMap(item -> item.getAppId(), item -> item)); 然后,这段代码是被dubbo中的线程执行的,所以,当时只抛了一句话,并没有堆栈信息,后面的日志都没有打印。以至于线程无缘无故后面的都不执行了... 阅读详情
AI摘要

本文详细解析了在使用Java8将list转换为map时遇到的DuplicateKey异常问题,通过实例演示了异常产生的原因,并提供了两种解决方案:一是避免key重复,二是使用自定义合并策略处理重复key。

Java8 Duplicate key 异常解决

1.在我们使用Java8中提供的list 转换map方法时,可能回出现下面的问题:

java.lang.IllegalStateException: Duplicate key...

    产生这个问题的原因时我们参与转换的list中,作为key的属性有重复,没有办法确定使用哪个元素来作为
转换后map中的value,下面的例子可以复现这个场景:


    @Test
    public void duplicateKey(){
        List<String> list = new LinkedList<>();
        list.add("apple");
        list.add("banana");
        list.add("banana");
        list.add("pear");
        Map<String, String> map = list.stream().collect(Collectors.toMap(item -> item, item -> item));
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.toString());
        }
    }

上面代码运行时,会产生这样的异常:


java.lang.IllegalStateException: Duplicate key banana

	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1253)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1235)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at com.lhc.dongpo.easy.MyTest.duplicateKey(MyTest.java:57)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	...

这个异常就是说,转换map的过程中,有两个key是banana的元素,不知道怎么取舍,因此产生异常。

2.解决。

    解决办法就是我们去提供这样一个策略。
查看他的源码:


    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
    }

    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
    }

有这样两个方法,出错的地方我们是用的第一个方法,对于可能存在重复key的转换中,我们要使用第二个方法。


        Map<String, String> map = list.stream().
                collect(Collectors.
                        toMap(item -> item, item -> item, (item1, item2) -> item1));

我这里使用的是两个key 相同时,保留先存进去的那个元素。相比第一个方法,主要就是我们要去实现一个策略,来决定key相同时,元素如何保留。

Qt开发者必看:QTimer::singleShot的5个实战避坑指南(含lambda和多线程案例) 本文为Qt开发者提供了QTimer::singleShot的5个关键实战避坑指南,涵盖lambda捕获、对象生命周期和多线程安全等核心难点。通过对比错误与正确代码示例,深入解析了如何避免悬空指针、确保线程执行上下文正确以及管理定时任务资源,帮助开发者编写更健壮、可靠的延迟执行代码。 阅读详情

相关推荐

ptrade量化策略之沪深300指数增强

本策略的核心是在沪深300股票池中选股,选择的股票都是市值比较大,业绩比较好的白马股,根据市场相对位置以及基本面因子来选择股票

qq_29301281的博客 1190

关于Java8当中List转Map报错“Duplicate key”的原因以及解决办法

    其实Java8的lamdba表达式了解的不是很透彻,在工作中也只是使用最多的就是 for循环遍历、list转map、map转list、分组等功能。需要什么就从网上百度查找,然后按照样子在自己代码中修改下。其中的细节并没有留意过,就在今天我不小心就掉进了坑里。     悲剧发生在今天早上,领导过来问我为什么业务上的数据有的时候会丢失,并让我排查下原因。我起初还怀疑是不是公司另外一端的接口有问题,于是就去问了下有没有上线之类的操作。得到的结果是:没有!     那我就只能从自己的代码入手了,我开始本地启

MonkeyBrothers的博客 2万+

深入解析TI C2000 ePWM模块:峰值电流模式Buck与LLC谐振变换器实战配置

脉宽调制(PWM)技术是电力电子与数字电源控制的核心,它通过调节开关信号的占空比或频率,实现对功率变换器输出电压、电流的精确控制。其基本原理是利用微控制器内部的定时器和比较器,生成具有特定时序的方波信号,驱动功率开关器件。这项技术的核心价值在于将复杂的模拟控制环路数字化,从而提升系统的可控性、灵活性和可靠性。在电机驱动、不间断电源(UPS)、服务器电源和新能源逆变器等广泛应用场景中,PWM技术都是实现高效能量转换的基石。本文聚焦于德州仪器(TI)C2000系列微控制器中功能强大的增强型PWM(ePWM)模块

weixin_30410119的博客 341

出现Duplicate key

出现Duplicate Key 解决

weixin_46455069的博客 1859

深入分析大众点评 Ajax 接口:直接请求 JSON 数据高效获取评论

大众点评网站采用前后端分离架构,通过Ajax接口动态加载数据。按F12打开开发者工具,切换到Network(网络)面板。实际环境中,我们需要使用Python重现这一加密逻辑。查看请求响应,寻找包含评论数据的JSON接口。参数是大众点评的反爬机制核心,需要特别处理。:尊重网站的robots.txt文件规定。:仅将数据用于合法合规的研究和分析目的。:不侵犯大众点评的商业秘密和知识产权。打开大众点评网站,进入任意商户页面。:对采集到的用户信息进行脱敏处理。:避免对目标网站造成过大负担。

Z_suger7的博客 1583

【Ensp】FTP服务器设置和FTP解析

大部分的多媒体多媒体应用协议,如SIP,FTP,NetMeeting协议等,使用约定的固定端口来初始化一个控制连接,再动态地选择端口用于数据传输,并且这些端口选择是不可预测的。在防火墙设置时,可以通过ASPF(应用层报文过滤)中的Server Map表来满足多通道协议的正常工作,它正常检测应用层报文信息,并动态地根据报文内容创建和删除临时的Server Map表项,以允许其它非约定端口通过防火墙。(5)我们可以在路由器或能访问ftp服务器的设备上,通过cli命令行的方式来访问ftp服务器。

进击的小小白 1862

duplicate key错误怎么解决

‌使用SQL的ON DUPLICATE KEY UPDATE语句‌:在MySQL中,可以使用INSERT …‌重试机制‌:在插入数据时,如果遇到DuplicateKeyException,可以设计重试逻辑,等待一段时间后再次尝试插入。‌分布式锁‌:使用Redis等分布式锁来确保在同一时间内只有一个服务实例可以写入数据。‌使用乐观锁‌:在Java中,可以使用版本号或时间戳来处理并发更新的问题。‌事务处理的最佳实践‌:确保事务的隔离级别和锁的选择能够适应高并发场景。获取锁:在插入数据前,尝试获取锁。

qq_33718794的博客 2407

Mac电脑本地安装Stable Diffusion小白教程避开所有坑教程

如果出现黄字部分警告,如WARNING: The scripts pip, pip3 and pip3.9 are installed inz‘/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin’ which is not on PATH)需要将其添加到path。下载pip,输入:curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py。

jackerjin123的博客 1799

详细解决java中的Collectors.toMap引起的java.lang.IllegalStateException: Duplicate key xxx 的错误

详细解决java中的Collectors.toMap引起的java.lang.IllegalStateException: Duplicate key xxx 的错误,比如java.lang.IllegalStateException: Duplicate key 2、java.lang.IllegalStateException: Duplicate key 1。

念兮为美 5645

体验灵雀云-创建基于Docker的云服务

今天体验了一下灵雀云,创建了第一个基于Docker的云服务。 1.登录灵雀云 2.开始使用 登录之后,从"控制台"进入操作界面,开始创建服务。 首先需要选择一个镜像。灵雀云已经为您提供了一些常用的镜像列表。请在“常用镜像”列表中,选择“其它”,然后找到“alauda/hello-world”镜像,点击它右侧的“选择”按钮,进入服务参数配置页面。 选择完要创建的

tomcat的专栏 3234

基于Simulink和Control System Toolbox的线控转向(Steer-by-Wire)系统设计

通过上述步骤,我们成功设计并实现了基于 Simulink 和 Control System Toolbox 的线控转向(Steer-by-Wire)系统。该系统能够接收来自方向盘的角度指令,经过控制器处理后,驱动转向执行器(如电动机),实现对车辆前轮转向角度的精确控制。通过虚拟场景仿真、硬件在环测试和实车测试,验证了系统的响应速度、控制精度、车辆稳定性和实时性能,并通过参数优化进一步提升了系统的性能。

MHD0815的博客 549

MYSQL之DUPLICATE KEY

如果插入的数据违反了唯一约束,MySQL 将执行更新操作而不是抛出错误。如果唯一键冲突,就会执行更新操作,否则会插入新行。:如果插入的数据违反了唯一约束,MySQL 将忽略该错误,不会执行任何操作。这意味着如果唯一键冲突,MySQL 将跳过该行,不会执行插入或更新操作。当向表中插入数据时,如果插入的数据违反了唯一约束(比如唯一索引或主键约束),就会触发。这些选项可以帮助开发者在插入数据时处理唯一键冲突的情况,使得数据操作更加灵活和可靠。为了处理这种情况,MySQL 提供了。在 MySQL 中,

weixin_53390884的博客 2899

uniapp:使用uni.request请求报错errMsg“:“request:fail abort statusCode:-1(uniApp使用uni.request向服务端接口发起请求失败报错)

解决request请求报错request:fail abort statusCode:-1,Uniapp打包到app后报错request:fail abort statusCode:-1,uniapp使用uni.request请求报错{“errMsg“:“request:fail abort statusCode:-1“}的解决办法,不是SSL证书问题,跳过ssl验证,解决https问题,Uniapp报错,小程序报错(含https解决方案)(真机预览问题)uni-app打包后不发请求的原因,uni-app真

✅ 精选推荐文章 3580

JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

测试又报bug啦 接到测试小伙伴的问题,说是一个接口不返回数据了,好吧,虽然不是我写的接口任务落到头上也得解决,本地调试了一下,好家伙,直接抛了个异常出来,这又是哪位大哥喝醉了写的代码... Exception in thread "main" java.lang.IllegalStateException: Duplicate key at java.util.str...

Elinor2017的博客 727

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java duplicate key_JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)...

测试又报bug啦接到测试小伙伴的问题,说是一个接口不返回数据了,好吧,虽然不是我写的接口任务落到头上也得解决,本地调试了一下,好家伙,直接抛了个异常出来,这又是哪位大哥喝醉了写的代码...Exception in thread "main" java.lang.IllegalStateException: Duplicate keyat java.util.stream.Collectors.la...

weixin_34449886的博客 529

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java8 stream数据流 Duplicate key 异常解决

对于业务流程中常使用myabtisPlus获取List对象集合,对于使用Java8中的steam流控制获取组成Map<String, Object>的数据时,出现键可能存在多个的时候可以使用如上属性进行处理。

xuwuzhixia的博客 562

解决jdk8 stream tomap方法报错:java.lang.IllegalStateException: Duplicate key异常解决(key重复)...

为什么80%的码农都做不了架构师?>>> ...

weixin_34037977的博客 2638

使用steam流转为map报错java.lang.IllegalStateException: Duplicate key解决

在实际应用开发中,会常把一个List的查询数据集合转为一个Map,那么在这里的 list.stream().collect()其实就是做了这么一件事情,它是java8的stream方式实现的它是以type为key,以entity对象为value构成Map。java.lang.IllegalStateException:Duplicatekey异常在将List转换为Map时出现,解决方法是使用toMap()的重载方法,如果已经存在则不再修改,直接使用上一个数据。

qq_499514925的博客 516

java8 stream多次map_解决jdk8 stream tomap方法报错:java.lang.IllegalStateException: Duplicate key异常解决(key重复)...

List userList = User.ME.loadList(users);if (CollectionUtils.isNotEmpty(userList)) {Map userMap = userList.stream().filter(Objects::nonNull).collect(Collectors.toMap(User::getId, u -> u);map.put("us...

weixin_36111561的博客 1168

【Exception】 Java Lambda List转换Map报错 触发异常 IllegalStateException: Duplicate key

在使用Java8 lambda 将List转换为Map时,遇到报错:IllegalStateException- Duplicate key .... 在使用lambda进行 list转换为map过程中,遇到 key重复的情况下,就会抛出异常 IllegalStateException- Duplicate key ... 1、在使用 lambda 进行list转换map时,要注意 可能会出现key重复的情况,日常开发中,

HaHa_Sir的博客 4219

java8 对象转map时重复key Duplicate key xxxx

我们在利用java8 Lambda 表达式将集合中对象的属性转成Map时就会出现Duplicate key xxxx , 说白了也就是key 重复了!案例如下: @Getter @Setter @AllArgsConstructor public class Student{ private String className; private String student...

luzhensmart的专栏 2884

IllegalStateException: Duplicate key

通过Java8的语法可将实体list转成 指定key的map,当key出现重复值的时候会报“IllegalStateException: Duplicate key” 的异常 解决方法: //b覆盖 allEmployees.stream() .collect(Collectors.toMap(CompanyEntity::getEmployeeId, Function.identity(), (a,b) -> b)) //保存a,不覆盖

SHUKAI618的博客 682

Java 中Duplicate key 异常

Java 中Duplicate key 异常

manhengwei 2261
上一篇: MySQL查询最大值、最小值所在行
下一篇: 源代码分析 spring.factories 的使用原理和实现自动装配
过河的小卒子
博客等级 码龄10年 39粉丝 112原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值