java.lang.IllegalStateException: Duplicate key 20
这个我在公司遇到的一个问题。原因:
使用Map<String, String> RelationMap = relation.stream().collect(Collectors.toMap(s -> s[2], s -> s[1], (oldValue, newValue) -> newValue)))
转换过程中出现重复的Key。导致有多个value程序不知道应该取哪个的问题。
正常案例
老师跟班级之间的关系,每一个老师都负责一个班级。
1 @Data
2 public class TeacherClass {
3
4 /**主键ID*/
5 private int id;
6
7 /**教师ID*/
8 private int teachId;
9
10 /**班级ID*/
11 private int classId;
12
13 public TeacherClass(int id, int teachId, int classId) {
14 this.id = id;
15 this.teachId = teachId;
16 this.classId = classId;
17 }
18 }
老师与班级的关系
实际应用代码
1 //查询所有老师负责的班级(一个老师对应一个班级)
2 List<TeacherClass> list = new ArrayList<>(20);
3 int count = 10;
4 for (int i = 0; i < count; i++) {
5 list.add(new TeacherClass(i, 100 + i, 200 + i));
6 }
7
8 //结果返回每个老师对应的班级ID
9 Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(TeacherClass::getTeachId, TeacherClass::getClassId));
10 System.out.println("老师负责的班级ID:" + collect);
执行结果如下

显然是OK的
错误案例
假设这个时候程序出了一个bug, 导致有一个老师负责两个班级。那么再执行之前的代码会有什么问题呢?
1 //查询所有老师负责的班级(一个老师对应一个班级)
2 List<TeacherClass> list = new ArrayList<>(20);
3 int count = 10;
4 for (int i = 0; i < count; i++) {
5 list.add(new TeacherClass(i, 100 + i, 200 + i));
6 }
7
8 //程序出了一个bug,导致有一个老师负责两个班级
9 list.add(new TeacherClass(50, 100, 300));
10
11 //结果返回每个老师对应的班级ID
12 Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(TeacherClass::getTeachId, TeacherClass::getClassId));
13 System.out.println("老师负责的班级ID:" + collect);
执行结果如下

显然是有问题的。原因就是出现了重复的Key, 那么怎么解决呢?
很简单,将Collectors.toMap(TeacherClass::getTeachId, TeacherClass::getClassId) 替换为Collectors.toMap(TeacherClass::getTeachId, TeacherClass::getClassId, (aLong, aLong2) -> aLong2 >= aLong ? aLong2 : aLong);
(aLong, aLong2) -> aLong2 >= aLong ? aLong2 : aLong表示的是出现重复Key的执行逻辑,如果出现重复Key取最大的value。具体逻辑可以自己定义
实际应用代码
1 //查询所有老师负责的班级(一个老师对应一个班级)
2 List<TeacherClass> list = new ArrayList<>(20);
3 int count = 10;
4 for (int i = 0; i < count; i++) {
5 list.add(new TeacherClass(i, 100 + i, 200 + i));
6 }
7
8 //程序出了一个bug,导致有一个老师负责两个班级
9 list.add(new TeacherClass(50, 100, 300));
10
11 //结果返回每个老师对应的班级ID
12 Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(TeacherClass::getTeachId, TeacherClass::getClassId
13 , (aLong, aLong2) -> aLong2 >= aLong ? aLong2 : aLong));
14 System.out.println("老师负责的班级ID:" + collect);
至此问题就解决了
java.lang.IllegalStateException: Duplicate key 20的更多相关文章
- JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
测试又报bug啦 接到测试小伙伴的问题,说是一个接口不返回数据了,好吧,虽然不是我写的接口任务落到头上也得解决,本地调试了一下,好家伙,直接抛了个异常出来,这又是哪位大哥喝醉了写的代码... Exce ...
- 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
大型网站技术架构(四)--核心架构要素 作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...
- Caused by: java.lang.IllegalStateException: duplicate key: datasource
java.lang.IllegalStateException: Failed to load property source from location 'classpath:/applicatio ...
- myeclipse 无法启动 java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
把myeclipse10 按照目录完整拷贝到了另外一台电脑, 另外的目录 原安装目录 D\:\soft\i\myeclipse10 新安装目录 E\:\soft\myeclipse10 双击启动失败, ...
- 关于java.lang.IllegalStateException
今天调试程序时遇到了java.lang.IllegalStateException org.apache.catalina.connector.ResponseFacade.sendRedirect( ...
- 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutputStream() has already been called
错误: 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutput ...
- java.lang.IllegalStateException: Connection pool shut down
最近使用HttpClient 4.5 使用 CloseableHttpClient 发起连接后,使用CloseableHttpResponse 接受返回结果,结果就报错了,上网查了下,有位stacko ...
- 云笔记项目- 上传文件报错"java.lang.IllegalStateException: File has been moved - cannot be read again"
在做文件上传时,当写入上传的文件到文件时,会报错“java.lang.IllegalStateException: File has been moved - cannot be read again ...
- java.lang.IllegalStateException——好头疼
在我东,下下来一个项目总会出现启动不了的问题,这些问题往往在编译的时候发现不了,当你的服务器启动的时候,就是一片片的报错,有些问题可以通过异常的提示信息,判断出来哪里配置错了,但是也有些情况下,从异常 ...
随机推荐
- 适合刚刚学习编程的萌新:C语言编程学习制作超简单又好玩的报数游戏!
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- eShopOnContainers 知多少[12]:Envoy gateways
1. 引言 在最新的eShopOnContainers 3.0 中Ocelot 网关被Envoy Proxy 替换.下面就来简要带大家了解下Envoy,并尝试梳理下为什么要使用Envoy替代Ocelo ...
- flutter——android报错建议Suggestion: add 'tools:replace="android:label"'
问题: 安装了一个新包,android出现了报错,建议add 'tools:replace="android:label"'. 原因: 项目application的label属性冲 ...
- cookie和session可以参考的文章
cookie和session可以参考的文章 cookie:http://www.lemfix.com/topics/5session:https://www.cnblogs.com/nickjiang ...
- linux硬盘分区及挂载
今天买的一台服务器发现其硬盘容量与购买界面的描述不符,于是我去问了客服才知道有一块硬盘需要自己挂载,所以记录自己硬盘分区以及挂载操作得此文. 测试环境 由于时间限制,本人仅在centos 8下测试 ...
- postgresql使用规范解读
表设计规范1.建议能使用小字节数类型,就不要用大字节数类型2.建议能用varchar(N).text就不用char(N):3.建议使用default NULL,而不用default '':4.建议使用 ...
- JS实现将二维数组生成到页面上
前言 之前没说过数组,现在来写一下数组 CSS span { border:2px solid skyblue; width:30px; height: 30px; display: inline-b ...
- Redis分布式锁及分区
以下内容是翻译的官网文档RedLock和分区部分,可以简单了解分布式锁在redis如何实现及其方式 redis分区的方法 redis实现的分布式锁RedLock算法,分布式锁,即在多个master上获 ...
- ubuntu18.04下的off-by-null:hitcon_2018_children_tcache
又没做出来,先说说自己的思路 因为是off-by-null,所以准备构造重叠的chunk,但是发现程序里有memset,给构造prev size造成重大问题 所以来详细记录一下做题过程 先逆向,IDA ...
- 支持向量机(SVM)必备概念(凸集和凸函数,凸优化问题,软间隔,核函数,拉格朗日乘子法,对偶问题,slater条件、KKT条件)
SVM目前被认为是最好的现成的分类器,SVM整个原理的推导过程也很是复杂啊,其中涉及到很多概念,如:凸集和凸函数,凸优化问题,软间隔,核函数,拉格朗日乘子法,对偶问题,slater条件.KKT条件还有 ...