这个我在公司遇到的一个问题。原因:
使用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. scp远程上传

      scp -P 22 /Users/mac/Downloads/VBoxGuestAdditions_5.2.12.iso root@192.168.1.210:/usr/local/src   s ...

  2. Codeforces Round #676 (Div. 2) A - D个人题解(E题待补)

    1421A. XORwice 题目链接:Click Here // Author : RioTian // Time : 20/10/18 #include <bits/stdc++.h> ...

  3. 【转】Python 魔法方法大全

    转载自鱼C论坛:http://bbs.fishc.org/thread-48793-1-2.html 据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Pyt ...

  4. PyTorch 中 weight decay 的设置

    先介绍一下 Caffe 和 TensorFlow 中 weight decay 的设置: 在 Caffe 中, SolverParameter.weight_decay 可以作用于所有的可训练参数, ...

  5. Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFix ...

  6. C#连接Access

    连接数据库 string oleCon = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + Application.Sta ...

  7. 数据结构(C++)——顺序栈

    顺序栈结构 #include<iostream> #define MaxSize 50 using namespace std; typedef int ElemType; typedef ...

  8. 如何使用Python爬取基金数据,并可视化显示

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Will的大食堂,作者打饭大叔 前言 美国疫情越来越严峻,大选也进入 ...

  9. CF1336 Linova and Kingdom

    题面 给定 n 个节点的有根树,根是 1 号节点. 你可以选择 k 个节点将其设置为工业城市,其余设置为旅游城市. 对于一个工业城市,定义它的幸福值为工业城市到根的路径经过的旅游城市的数量. 你需要求 ...

  10. python实现登录验证系统(搭建MVC框架)

    小型登录注册验证系统 关注公众号"轻松学编程"了解更多. 一.概述 ​ 使用Redis+MySQL数据库实现一个小型的登录注册验证系统.在这个系统中初步了解认识MVC框架. ​ 具 ...