这个我在公司遇到的一个问题。原因:
使用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的更多相关文章

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

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

  2. 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

    大型网站技术架构(四)--核心架构要素   作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...

  3. Caused by: java.lang.IllegalStateException: duplicate key: datasource

    java.lang.IllegalStateException: Failed to load property source from location 'classpath:/applicatio ...

  4. 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 双击启动失败, ...

  5. 关于java.lang.IllegalStateException

    今天调试程序时遇到了java.lang.IllegalStateException org.apache.catalina.connector.ResponseFacade.sendRedirect( ...

  6. 严重: 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 ...

  7. java.lang.IllegalStateException: Connection pool shut down

    最近使用HttpClient 4.5 使用 CloseableHttpClient 发起连接后,使用CloseableHttpResponse 接受返回结果,结果就报错了,上网查了下,有位stacko ...

  8. 云笔记项目- 上传文件报错"java.lang.IllegalStateException: File has been moved - cannot be read again"

    在做文件上传时,当写入上传的文件到文件时,会报错“java.lang.IllegalStateException: File has been moved - cannot be read again ...

  9. java.lang.IllegalStateException——好头疼

    在我东,下下来一个项目总会出现启动不了的问题,这些问题往往在编译的时候发现不了,当你的服务器启动的时候,就是一片片的报错,有些问题可以通过异常的提示信息,判断出来哪里配置错了,但是也有些情况下,从异常 ...

随机推荐

  1. sql server 2008 r2 直接下载地址,可用迅雷下载

    sqlserver 2008 r2 直接下载地址,可用迅雷下载 下载sqlserver 2008 r2 ,微软用了一个下载器,经过从下载器上,将他的地址全部用键盘敲了下来.最终的简体中文版地址如下: ...

  2. Linux-京西百花山

    百花山有三个收票的入口,分别在门头沟(G109).房山(G108)和河北 108有两个方向上百花山,史家营和四马台.只有史家营方向能开车到山顶. 四马台那边,不住,要坐景区车才行 尽头是1900多米的 ...

  3. 正式班D14

    2020.10.23星期五 正式班D14 9.5 文件处理三剑客(支持|) 9.5.1 sed流式编辑器 事先制定好编辑文件的指令,让sed自动完成对文件的整体编辑(同一时间内存中只有文件中一条) # ...

  4. 【原创】linux实时操作系统xenomai x86平台基准测试(benchmark)

    一.前言 benchmark 即基准测试.通常操作系统主要服务于应用程序,其运行也是需要一定cpu资源的,一般来说操作系统提供服务一定要快,否则会影响应用程序的运行效率,尤其是实时操作系统.所以本文针 ...

  5. Spring Boot打包部署

    date: 2018-11-19 15:30:11 updated: 2018-11-21 08:28:37 Spring Boot打包部署 第一种方式 打包成jar包部署在服务器上 1.1 添加插件 ...

  6. python接口自动化测试--数据分离读取Excal指定单元格数据

    上一篇博客讲了怎么批量读取Excal单元格数据,现在咱们说一下怎么读取Excal指定单元格数据. 一.首先建一个Test_Main类 #!/usr/bin/python # -*- coding: U ...

  7. Shell脚本实现---Swarm集群部署实例(Swarm Cluster)

    Shell脚本实现---Swarm集群部署实例(Swarm Cluster) 一.机器环境(均是centos7.8) IP hostname 角色 192.168.10.200 manager-swa ...

  8. pytorch 图像分类数据集(Fashion-MNIST)

    import torch import torchvision import torchvision.transforms as transforms import matplotlib.pyplot ...

  9. Spark: JAVA_HOME is not set

    在Spark项目,sbin目录下的spark-config.sh文件下,最后添加JAVA_HOME的索引. 即可.

  10. (模板)graham扫描法、andrew算法求凸包

    凸包算法讲解:Click Here 题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是 ...