Java8之Stream流的Collectors.toMap Duplicate key问题

1.背景

在项目部署的时候,编译通过,但是一直运行不起来,看到错误日志之后发现:
在这里插入图片描述

Caused by: java.lang.IllegalStateException: Duplicate key TaxiCarpoolCommonConfig

出错代码:

Map<String, TaxiCarpoolCommonConfig> taxiCarpoolConfigMap = configList.stream().collect(Collectors.toMap(TaxiCarpoolCommonConfig::getRouteId, e -> e));

原因是我使用stream将list转成Map的时候,有一个RouteId是重复的,导致转换报错

2.原因分析

我们直接看一下toMap的具体实现:
在这里插入图片描述

可以看到当前调用的toMap方法有两个参数

1.keyMapper:Key 的映射函数。
2.valueMapper:Value 的映射函数。
3.mergeFunction:当 Key 冲突时,调用的合并方法。
4.mapSupplier:Map 构造器,在需要返回特定的 Map 时使用。`

toMap方法里主要是通过merge方法合并
在这里插入图片描述

而merge方法里会判断同样的key是否存在过,如果存在过就会抛出异常
在这里插入图片描述

3.解决方案

如果你的业务里要求key绝对不允许重复,那么可以在操作的时候通过try catch代码块包括,走异常逻辑

    public static void main(String[] args) {List<User> list = Arrays.asList(User.builder().id(1).name("张三").build(),User.builder().id(2).name("李四").build(),User.builder().id(2).name("王五").build());try {Map<Integer, User> map = list.stream().collect(Collectors.toMap(User::getId, e -> e));System.out.println(map);}catch (Exception e){System.out.println("兜底逻辑");}}

如果允许重复的话,只是重复的场景下随便取一条,则可以通过

Map<Integer, User> map = list.stream().collect(Collectors.toMap(User::getId, e -> e,(a,b)->a));

的方式取第一个

没加之前:

    public static void main(String[] args) {List<User> list = Arrays.asList(User.builder().id(1).name("张三").build(),User.builder().id(2).name("李四").build(),User.builder().id(2).name("王五").build());Map<Integer, User> map = list.stream().collect(Collectors.toMap(User::getId, e -> e));System.out.println(map);}

在这里插入图片描述

加了之后:

    public static void main(String[] args) {List<User> list = Arrays.asList(User.builder().id(1).name("张三").build(),User.builder().id(2).name("李四").build(),User.builder().id(2).name("王五").build());Map<Integer, User> map = list.stream().collect(Collectors.toMap(User::getId, e -> e, (a, b) -> a));System.out.println(map);}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实体、协议、服务和服务访问点

目录 一、概念 二、相邻两层之间的关系 三、面向连接服务的特点 四、无连接服务的特点 五、著名的协议举例 一、概念 实体&#xff08;entity&#xff09;表示任何可发送或接收信息的硬件或软件进程。同机器上同一层的实体叫做对等实体&#xff08;peer entity&#xff0…

【23真题】押题卷的漏网之鱼!

今天分享的是23年中国计量大学805的信号与系统试题及解析。第二大题的第1小题这类题&#xff01;太经典了&#xff0c;他那个相位图像&#xff0c;怎么看都是24真题的样子图片。但是我出的话&#xff0c;会把幅频特性从三角变为矩形&#xff0c;再加上个信号是否无失真的判断。…

【开源】基于Vue.js的贫困地区人口信息管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 073 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S073。} 文末获取源码&#xff0c;项目编号&#xff1a;S073。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模…

骨传导耳机音量大了有害吗?骨传导能保护听力吗?

无论是传统耳机还是骨传导耳机&#xff0c;只要使用音量过大&#xff0c;都会对有一定的损伤&#xff0c;然而由于骨传导耳机的传声原理和佩戴方式比较特殊&#xff0c;所以对人体的损伤比较小&#xff0c;想要知道骨传导耳机能否保护听力&#xff0c;就要先了解骨传导耳机的传…

C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构一)

从前不会回头&#xff0c;往后不会将就。 ----小新 一.ARM采用32位架构 ARM约定一个Byte是8 bits&#xff0c;一个Halfword是16 bits (2 byte)&#xff0c;一个Word是32 bits (4 byte)。大部分ARM core …

使用百度开发者平台处理语音朗读

--TIME --百度开发者中心-汇聚、开放、助力、共赢 --注册账号 -- 准备工作 准备工作 更新时间&#xff1a;2023-01-13 成为开发者 三步完成账号的基本注册与认证&#xff1a; STEP1&#xff1a;点击进入控制台&#xff0c;选择需要使用的AI服务项。若为未登录状态&#xf…

安装Python以及pycharm

Pycharm是编辑器。相当于Word对文字进行编辑。 Python是解释器。讲代码翻译为计算机可以理解的指令。 1、安装Python 官网&#xff1a;Welcome to Python.org 打开的时候有点慢等待一会就好&#xff0c;点击下载&#xff0c;选择Windows版本 等待一会&#xff0c;可以看到如…

Java类的初始化顺序

类初始化顺序遵循以下三个原则&#xff08;优先级依次递减&#xff09; 1、静态对象&#xff08;变量&#xff09;优先于非静态对象&#xff08;变量&#xff09;初始化&#xff0c;其中静态对象&#xff08;变量&#xff09;只初始化一次&#xff0c;而非静态对象&…

Spring-事务支持

目录 一、事务概述 二、引入事务场景 三、Spring对事务的支持 Spring实现事务的两种方式 声明式事务之注解实现方式 1.在Spring配置文件中配置事务管理器 2. 在Spring配置文件引入tx命名空间 3. 在Spring配置文件中配置“事务注解驱动器”&#xff0c;通过注解的方式控…

容器技术发展史,编排与容器的技术演进之路——2

目录&#xff1a; 容器技术发展史 Jail时代 1979 年 贝尔实验室发明 chroot2000 年 FreeBSD 4.0 发行 FreeBSD Jail2001 年 Linux VServer 发行2004 年 Solaris Containers 发行云时代 2006 年 google 推出 Process Containers2008 年 LXC 推出2011 年 CloudFoundry 推出 Ward…

RH850P1X芯片学习笔记-Pin Functions

文章目录 Pin Connection Diagrams术语定义 Pin ListPort OverviewIntroductionFunctional OverviewPort CategoryOperation Mode运行模式 Port Function寄存器地址映射 Port寄存器描述Pn/JP0 — Port RegisterPPRn/JPPR0 — Port Pin Read RegisterPMn/JPM0 — Port Mode Regi…

apk和小程序渗透测试

apk和小程序渗透测试 文章目录 apk和小程序渗透测试小程序渗透测试apk和小程序的抓包安装证书apk渗透 小程序渗透测试 小程序的默认路径在 C:\Program Files (x86)\Tencent\WeChat\WeChatApp 使用UnpackMiniApp、wxappUnpacker工具完成逆向 先打开UnpackMiniApp.exe工具 选…