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——好头疼
在我东,下下来一个项目总会出现启动不了的问题,这些问题往往在编译的时候发现不了,当你的服务器启动的时候,就是一片片的报错,有些问题可以通过异常的提示信息,判断出来哪里配置错了,但是也有些情况下,从异常 ...
随机推荐
- python爬虫 -掘金
import json from time import sleep import requests url = "https://web-api.juejin.im/query" ...
- 使用Navicat远程连接阿里云ECS服务器上的MySQL数据库
一.必须给服务器的安全组规则设置端口放行规则,在管理控制台中设置: 之后填写配置,授权对象是授权的IP,其中0.0.0.0/0为所有IP授权,之后保存; 二.Navicat使用的配置 在编辑连接处,要 ...
- springboot错误统一处理
1,对于404,500这类错误,可以直接新建public/error目录 ,在error目录 中新建404.html, 500.html或5xx.html,springboot会自动跳转到这些静态页面 ...
- [bug]录
后端请求地址找不到,Tomcat服务器无响应 报404错误 查看资料和视频,用了2天时间(实际不到2天),还没有解决,我在书上找了描述,也问了别人,路径改成图上所说,还是未解决,找资源找到不广泛,没找 ...
- angular页面
<!DOCTYPE html><!--[if lt IE 9]> <html lang="zh" xmlns:ng="http://angu ...
- CodeForces 1426F Number of Subsequences
题意 给定一个长度为 \(n\) 的串,只包含 abc 和通配符.通配符可以替换 abc 的一个.求所有得到的字符串中子序列 abc 出现的次数,对 \(10^9+7\) 取模. \(\texttt{ ...
- 存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?
引言 随着大数据技术架构的演进,存储与计算分离的架构能更好的满足用户对降低数据存储成本,按需调度计算资源的诉求,正在成为越来越多人的选择.相较 HDFS,数据存储在对象存储上可以节约存储成本,但与此 ...
- NoSQL非关系型数据库
NoSQL 关注公众号"轻松学编程"了解更多. 一.概念 NoSQL(Not Only SQL)非关系型数据库(功能换效率). 优点 开发维护成本低 访问灵活 访问速度快(缓存+快 ...
- Java_三大特征相关
重写 子类通过重写父类的方法, 可以用自身的行为替换父类的行为 重写的三个要点: "==" :方法名, 形参列表, 返回值类型相同 "<=" : 返回值类 ...
- yaf拓展安装步骤
1.wget http://pecl.php.net/get/yaf-3.0.7.tgz //下载yaf.tar 2.tar zxvf yaf-3.0.7.tgz //解压 3.cd yaf-3.0. ...