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

news2024/12/27 11:28:31

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

一、问题描述

        在使用Java8 lambda 将List转换为Map时,遇到报错:IllegalStateException- Duplicate key ....

        具体报错信息如下:


java.lang.IllegalStateException: Duplicate key com.runcode.springboottourist.lambda.ListToMap2$Person@4fccd51b

	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1245)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
	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.runcode.springboottourist.lambda.ListToMap2.demoExp(ListToMap2.java:41)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

二、代码复现

        1、定义一个普通的 Person 类

static class  Person{
    private Integer id ; //Id
    private String name ; // 名称
    private String gender; // 性别, 1:男;0:女
    // ignore getter / setter 
}

        2、初始化数据

final List<Person> list = Lists.newArrayList();

@Before
public void init(){
   list.add(new Person( 1,"小明","1"));
   list.add(new Person(2,"小红","0"));
   list.add(new Person(3,"小花","0"));
   System.out.println("初始化数据完成,list.size="+list.size());
}

        3、模拟异常复现

/**
 * Description: 演示 IllegalStateException: Duplicate key 异常
 * @return  void
 * @version v1.0
 * @author wu
 * @date 2022/12/5 15:52
 */
@Test
public void demoExp() throws Exception {
    final Map<String, Person> map = list.stream().collect(Collectors.toMap(Person::getGender, v -> v));
    System.out.println(map);
}

三、问题解决

        1、原因:

     在使用lambda进行 list转换为map过程中,遇到 key重复的情况下,就会抛出异常 IllegalStateException- Duplicate key ...

        2、解决:使用 Collectors.toMap 重载的 mergeFunction 方法 解决

@Test
public void fixToMapExp() throws Exception {
    // 办法一: 若冲突,保留前者
    final Map<String, Person> map = list.stream().collect(Collectors.toMap(Person::getGender, v -> v, (v1, v2) -> v1));
    System.out.println(JSON.toJSONString(map));

    // 办法二:若冲突,保留后者
    final Map<String, Person> map2 = list.stream().collect(Collectors.toMap(Person::getGender, Function.identity(), (v1, v2) -> v2));
    System.out.println(JSON.toJSONString(map2));
}

四、总结

        1、在使用 lambda 进行list转换map时,要注意 可能会出现key重复的情况,日常开发中,使用 Collectors.toMap 重载的 mergeFunction 方法 ,可以从源头上避免 key 重复的情况。

        2、也可以使用 Collectors.groupingBy 方法,直接转换为 对应的 List ,根据实际需求灵活处理即可。


@Test
public void fixGrouping() throws Exception {
    final Map<String, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getGender));
    System.out.println("按照 gender 分组:" + JSON.toJSONString(map));

    final Map<String, Map<String, Person>> map2 = list.stream().collect(Collectors.groupingBy(Person::getGender, Collectors.toMap(Person::getName, v -> v)));
    System.out.println("按照 gender 分组 map2 :" + JSON.toJSONString(map2));
}

更多关于 List 集合的知识:

Java 集合分页 Java List集合分页 List 分页 Java List集合笛卡尔积_HaHa_Sir的博客-CSDN博客_集合分页

Java List排序 java ListMap 排序 Java listmap 模拟 oracle 排序 Java listmap 模拟 mysql 排序_HaHa_Sir的博客-CSDN博客

两个List循环效率对比 List转Map 循环效率对比 Listmap 循环 效率对比_HaHa_Sir的博客-CSDN博客

Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序_HaHa_Sir的博客-CSDN博客_java8 集合排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Dockerfile创建镜像

目录 一、Docker镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于Dockerfile 创建 3.1 联合文件系统(UnionFS ) 3.2 镜像加载原理 二、Dockerfile 操作命令的指令 1 FROM 镜像 2 MAINTAINER 名字 3 RUN 命令 4 ENTRYPOINT 5 CMD ENTRYPOINT和CMD的区别&…

HTML网页设计【足球科普】学生DW静态网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【openWrt】设置执行定时任务

遇到一个问题&#xff0c;使用openWrt软路由搭建服务器&#xff0c;在docker装了一个maccmsV10&#xff0c;需要每天执行cj信息定时任务&#xff0c;但是maccmsV10本身不支持执行定时任务的配置的。 看了下&#xff0c;openWrt是支持本身是linux系统&#xff0c;所以是可以设…

糟糕,数据库异常不可用怎么办?

摘要&#xff1a;糟糕&#xff0c;数据库异常不可用怎么办&#xff1f;挺着急的&#xff0c;在线等。本文分享自华为云社区《糟糕&#xff0c;数据库异常不可用怎么办&#xff1f;》&#xff0c;作者&#xff1a;GaussDB 数据库。 随着数字化转型的加速&#xff0c;数据量爆发…

获取鼠标在画布中的位置

获取鼠标在画布中的位置 效果展示 概述 本文讲解如何实现我们平时用的画布软件中&#xff0c;怎么获取的我们鼠标时刻在画布中的位置。 构建HTML框架 <body><div class"box"></div> </body>CSS样式 <style>.box {/* 设置盒子…

IDEA 2022.3 发布,终于支持 redis 了

IntelliJ IDEA 发布了最新2022.3版本&#xff0c;本次更新&#xff1a;可以通过设置切换到新 UI&#xff0c;即可预览焕然一新的 IDE 外观。引入了一个新的 Settings Sync&#xff08;设置同步&#xff09;解决方案&#xff0c;用于同步和备份自定义用户设置。此外&#xff0c;…

私域运营对于企业的重要性

企业进行私域流量的精细化运营&#xff0c;不仅可以打造属于企业自己的社群王国&#xff0c;还可以挖掘存量客户的价值&#xff0c;实现更智能的客户管理和个性化运营方案。 前言 相信每个人都对瑞幸咖啡略有耳闻&#xff0c;这个国产咖啡品牌曾一度被封神&#xff0c;但随着财…

【leetcode】2404. 出现最频繁的偶数元素(js实现)

1. 题目 2404. 出现最频繁的偶数元素 2. 思路 创建哈希表&#xff0c;统计偶数的出现次数将哈希表转换成数组&#xff0c;遍历哈希表&#xff0c;设置res的初始值为[-1&#xff0c;0]&#xff0c;第一个值为偶数值&#xff0c;第二个值为这个偶数出现的次数&#xff1b;如果…

探花交友_第3章_完善个人信息(新版)

探花交友_第3章_完善个人信息(新版) 文章目录探花交友_第3章_完善个人信息(新版)课程介绍1. 完善用户信息1.1 阿里云OSS1.1.1 概述1.1.2 账号申请购买服务创建Bucket1.1.3 抽取模板工具OssPropertiesOssTemplateTanhuaAutoConfiguration1.1.4 测试1.2 百度人脸识别1.2.1 概述1.…

PyCharm+PyQT5之四第二个QT程序

前面程序实现了逻辑分离&#xff0c;第二个QT程序将建立控件之间的关联&#xff0c;并自行撰写&#xff0c;事件。 首先&#xff0c;建立只有一个按钮的界面 点击工具栏编辑信号与槽&#xff0c;按钮带有红框并拖拽&#xff0c;这样间建立了按钮与dialog的槽信号。 按钮一般是…

【OpenCV学习】第7课:形态学操作-膨胀与腐蚀

仅自学做笔记用,后续有错误会更改 理论 图像形态学操作-基于形状的一系列图像处理操作的合集, 主要是基于集合论基础上的形态学数学形态学有4个基本操作:膨胀丶腐蚀丶开丶闭膨胀与腐蚀是图像处理中最常用的形态学操作手段 形态学操作(morphology operators)-膨胀 跟前边的卷…

行者AI解析内容审核平台中的图像检测技术原理

本文首发&#xff1a;行者AI谛听 近些年&#xff0c;监管部分对于平台的信息方面&#xff0c;越来越严格&#xff0c;继而有很多企业选择智能AI内容审核服务&#xff0c;帮助企业快速处理平台上一些违规内容。 很多人不懂这方面到底属于什么&#xff0c;今天行者AI就来为大家解…

【Python】python入门,这一篇就够了

快速入门/一文免挂Python程序元素变量python中的符号Python的程序结构分支结构异常处理循环结构Python函数python中的可变参数python中的全局变量和局部变量组合数据类型之序列类型序列通用操作字符串&#xff08;str&#xff09;字符串常用函数字符串类型的格式化列表&#xf…

Qt第三十一章:渐变QGradient

线性渐变&#xff1a;QLinearGradient class TestGradient(QWidget):def __init__(self, parentNone):super(TestGradient, self).__init__(parent)self.resize(300, 300)label QLabel(self)label.setGeometry(0, 0, 300, 300)"""线形渐变"""la…

802.11基础——术语及缩略语

目录 WiFi LAN&#xff08;局域网&#xff09; WAN&#xff08;广域网&#xff09; WLAN&#xff08;Wireless LAN&#xff0c;即无线局域网&#xff09; AP&#xff08;Access point的简称&#xff0c;即访问点&#xff0c;接入点&#xff09; Station&#xff08;工作站…

HTML期末学生大作业 基于HTML+CSS+JavaScript通用的后台管理系统ui框架模板

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]Python计算机毕业设计Django线上评分分享平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Docker安装MoogoDB, 进入容器, mongo shell操作mongoDB

安装MoogoDB, 进入容器, mongo shell操作mongoDB [Docker-Compose方式、普通方式] 文章目录安装MoogoDB, 进入容器, mongo shell操作mongoDB[Docker-Compose方式、普通方式]附件&#xff1a;单词本附件&#xff1a;什么是 . yml 后缀文件 ?[ 普通方式 ]1. 下载镜像:* 拓展&am…

职场中,如何让“讨厌的人”配合自己工作?

在职场上&#xff0c;我们总会遇到那么几个不愿意配合你工作的人&#xff0c;不仅不配合&#xff0c;甚至还喜欢扯皮&#xff0c;推卸责任&#xff0c;甩锅给自己的队友。然而&#xff0c;我们也不可能因为工作中出现了这样一个或几个人&#xff0c;就离职不干&#xff0c;或者…

ChatGPT-地表最强AI模型!要消灭人类?

大家好&#xff0c;我是贺同学&#xff0c;最近&#xff0c;美国人工智能研究机构 Openai 发布了最新的大语言模型 ChatGPT&#xff0c;惊艳的性能在海外掀起了一波又一波热潮。通过对各种领域专业知识的训练&#xff0c;ChatGPT 不仅可以帮助人们搜索知识&#xff0c;还能进行…