Stream流List转Map报错Duplicate key StreamMap

项目场景:

JDK8引入了Stream流,让程序员在开发中更方便进行集合之间的转换,在使用Stream流将List转为Map时,如果Map的key有重复的情况下,就会抛出java.lang.IllegalStateException: Duplicate key StreamMap这个异常。这个坑是不太容易被发现的,解决方法也非常简单,只需要在List转Map的时候指定,如果出现重复的Key,那么以哪个为最终的结果放入Map。


案列演示

这里我定义了一个SKU类,申明了三个SKU对象,其中有两个SKU对象的skuCode是一致的,我将按skuCode作为Mapkey

 @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Sku {

        private String skuName;

        private String skuCode;

        private BigDecimal weight;

    }
public class StreamMap {

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static void main(String[] args) throws JsonProcessingException {

        Sku skuOne = Sku.builder().skuCode("bread").skuName("面包").weight(new BigDecimal(100.00)).build();
        Sku skuTwo = Sku.builder().skuCode("bread").skuName("面包").weight(new BigDecimal(110.00)).build();
        Sku skuThress = Sku.builder().skuCode("cheese").skuName("奶酪").weight(new BigDecimal(100.00)).build();
        List<Sku> skus = Arrays.asList(skuOne, skuTwo, skuThress);
        //以skuCode为key构建map
        Map<String, Sku> skuMap = skus.stream().collect(Collectors.toMap(Sku::getSkuCode, Function.identity()));
        System.out.println(OBJECT_MAPPER.writeValueAsString(skuMap));
    }
}

允许以上代码时,在使用Stream将List转Map时,由于List中skuCode相同的有多条,就会出现Duplicate key异常

Exception in thread "main" java.lang.IllegalStateException: Duplicate key StreamMap.Sku(skuName=面包, skuCode=bread, weight=100)

解决方案:

解决方案也非常简单,只需指定当List转Map时出现多个相同的key时,优先第一次出现那条数据还是最后出现的那条数据,比如本次案列中skuCodebread出现了两次,那么将由你来决定如果出现多条相同key的数据,是将第一条放入Map还是第二条放入Map。如果要将第一条放入Map,只需要优化一下代码如下:

public class StreamMap {

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static void main(String[] args) throws JsonProcessingException {

        Sku skuOne = Sku.builder().skuCode("bread").skuName("面包").weight(new BigDecimal(100.00)).build();
        Sku skuTwo = Sku.builder().skuCode("bread").skuName("面包").weight(new BigDecimal(110.00)).build();
        Sku skuThress = Sku.builder().skuCode("cheese").skuName("奶酪").weight(new BigDecimal(100.00)).build();
        List<Sku> skus = Arrays.asList(skuOne, skuTwo, skuThress);
        //以skuCode为key构建map
//        Map<String, Sku> skuMap = skus.stream().collect(Collectors.toMap(Sku::getSkuCode, Function.identity()));
        Map<String, Sku> skuMap = skus.stream().collect(Collectors.toMap(Sku::getSkuCode, Function.identity(), (o1, o2) -> o1));
        System.out.println(OBJECT_MAPPER.writeValueAsString(skuMap));
    }
}

打印出结果可以看到,weight为100的那条数据放入了Map
在这里插入图片描述
如果选择出现相同的key数据时,将最后出现的那条数据放入Map,代码如下:

public class StreamMap {

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static void main(String[] args) throws JsonProcessingException {

        Sku skuOne = Sku.builder().skuCode("bread").skuName("面包").weight(new BigDecimal(100.00)).build();
        Sku skuTwo = Sku.builder().skuCode("bread").skuName("面包").weight(new BigDecimal(110.00)).build();
        Sku skuThress = Sku.builder().skuCode("cheese").skuName("奶酪").weight(new BigDecimal(100.00)).build();
        List<Sku> skus = Arrays.asList(skuOne, skuTwo, skuThress);
        //以skuCode为key构建map
//        Map<String, Sku> skuMap = skus.stream().collect(Collectors.toMap(Sku::getSkuCode, Function.identity()));
        Map<String, Sku> skuMap = skus.stream().collect(Collectors.toMap(Sku::getSkuCode, Function.identity(), (o1, o2) -> o2));
        System.out.println(OBJECT_MAPPER.writeValueAsString(skuMap));
    }
}

打印出结果可以看到,weight为110的那条数据放入了Map
在这里插入图片描述
如果要使用Stream将List转为Map,那么应该注意List中有相同Key出现的情况,避免出现Duplicate key 这种情况

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表&#xff1a;树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表&#xff0c;这样效率会高一些。 数组模拟单链表 邻接表&#xff1a;存储图和树 实…

KubeVela篇06:Kubevela Addon插件安装原理

addon支持从本地、git仓库、helm chart仓库安装,最终原理都相同,因此我们以本地安装为例。 完整流程如下: 从指定目录读取一个完整的addon安装包。 根据metadata.yaml配置文件,校验插件要求的kubevela、k8s的版本,不满足版本要求则终止安装。 根据metadata.yaml配置文件…

深入理解 PostgreSQL 的架构和内部工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

FPGA配置文件从串并模式下载

FPGA配置文件的下载模式有5种&#xff1a; 主串模式&#xff08;master serial&#xff09;从串模式&#xff08;slave serial&#xff09;主并模式&#xff08;master selectMAP&#xff09;从并模式&#xff08;slave selectMAP&#xff09;JTAG模式 其中&#xff0c;JTAG模…

信捷PLC RC低通滤波器(C语言实现)

PLC信号处理系列之RC低通滤波器算法详细介绍请参考下面文章: PLC信号处理系列之一阶低通(RC)滤波器算法_plc滤波算法程序_RXXW_Dor的博客-CSDN博客1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点; 1、在模拟常数要求较…

什么小程序需要商家自营相关类目?

1、百货&#xff1a;小程序主体公司综合零售商&#xff0c;在线售卖多种日用品&#xff0c;需补充商家自营-百货类目。预包装食品定义&#xff1a; 预包装食品&#xff0c;指预先定量包装或者制作在包装材料和容器中的食品&#xff1b;包括预先定量包装以及预先定量制作在包装…

配置右键点击文件夹通过IDEA打开项目

0、 前言 你是不是每次打开idea项目时&#xff0c;都需要走一遍这样的流程&#xff1a; 1、先启动idea 2、然后手动选择项目路径 3、打开项目 于是在打开项目的路上就耗费了大量的时间。 这篇文章会教你通过配置&#xff0c;让项目可以直接通过右键打开&#xff0c;大大提升项…

【JAVA】云HIS系统功能菜单知识(二)

随着医疗信息化和互联网技术的不断发展&#xff0c;云HIS在大数据管理和应用的优势日益凸显。对于医疗机构而言&#xff0c;云HIS平台可以帮助其实现更高效的医疗服务管理&#xff0c;并提高医疗服务的整体水平和效率。 一、系统管理 1.医院信息 基本信息、法人代表、主要负责…

【数据结构】链表是否有环相关问题

文章目录 快指针走3、4、5步甚至更多可以吗为什么快慢指针一定在入口点相遇![在这里插入图片描述](https://img-blog.csdnimg.cn/ba346dbc9fee425dbb895ae2962e99ce.png) 快指针走3、4、5步甚至更多可以吗 部分情况下可以。 如果这样&#xff0c;相对&#xff08;追及&#xf…

Linux -- 进阶 自动挂载服务 ( autofs ) 介绍及安装 主配置文件分析

背景引入 &#xff1a; 针对于 挂载 &#xff0c; 大家有没有思考过一个问题&#xff0c;如果我们需要挂载的文件或访问的远程数据甚至只是挂载一些设备&#xff0c;如果太多的话&#xff0c;数量很大的话&#xff0c;那 光每次挂载 敲的 mount 命令&#xff0c;都得敲很多遍…

【晓风残月】byte,short,int,long——八种基本类型

文章目录 前言废话不多说&#xff0c;总结下今天的成果以及踩的坑 一、第一个坑【数据丢失】二、第二个坑【byte集合无法转换byte数组】三、第三个坑【Byte[]转byte[]】四、第四个坑【16进制转byte】总结快一年没写博客了&#xff0c;貌似都不记得过去的自己了向前看&#xff1…

DASCTF 2023 0X401七月暑期挑战赛RE题解

比赛期间没有什么时间&#xff0c;赛后做的题。 TCP 这题最难&#xff0c;耗时最久&#xff0c;好像做出来的人不多。 程序开始有个初始化随机数的过程&#xff0c;数据写入qword_5060开始的48个字节。 这里是主函数&#xff0c;连接到服务器以后&#xff0c;先接收32个字节…

spring-IOC

IOC容器 简介 IoC(Inversion of Control)控制反转&#xff0c;是一种基于面向对象编程法则的设计思想&#xff0c;它设计出的程序具有松耦合、更优良的特点。 IoC容器是Spring框架中重要的核心组件之一&#xff0c;贯穿了Spring从出生到成长的整个过程&#xff0c;Spring通过I…

K8S下如何搭建eureka集群

背景 传统应用上云&#xff0c;基于传统应用需要考虑上云的方案和改造成本&#xff0c;这也是传统应用上云过程中的难点&#xff0c;本篇介绍3台eureka搭建的方案。 方案一 此方案借助了K8S中Service的一些功能。 这种方案是传统方案的简单迁移版本&#xff0c;比较易于理解…

19.主题时钟

主题时钟 html部分 <div class"btn">黑色</div><div class"clock-container"><div class"time">21</div><div class"date">21</div><div class"clock"><div class&qu…

MOS,PCB如何添加散热孔、过孔

一、什么是 PCB 散热孔&#xff1f; 散热孔是利用贯通PCB板的通道&#xff08;过孔&#xff09;使热量传导到背面来散热的手法&#xff0c;配置在发热体的正下方或尽可能靠近发热体。 散热孔是利用PCB板来提高表面贴装部件散热效果的一种方法&#xff0c;在结构上是在PCB板上…

IMU和视觉融合学习笔记

利用纯视觉信息进行位姿估计&#xff0c;对运动物体、光照干扰、场景纹理缺失等情况&#xff0c;定位效果不够鲁棒。当下&#xff0c;视觉与IMU融合(VI-SLAM&#xff09;逐渐成为常见的多传感器融合方式。视觉信息与IMU 数据进行融合&#xff0c;根据融合方式同样可分为基于滤波…

【《机器学习和深度学习:原理、算法、实战(使用Python和TensorFlow)》——以机器学习理论为基础并包含其在工业界的实践的一本书】

机器学习和深度学习已经成为从业人员在人工智能时代必备的技术&#xff0c;被广泛应用于图像识别、自然语言理解、推荐系统、语音识别等多个领域&#xff0c;并取得了丰硕的成果。目前&#xff0c;很多高校的人工智能、软件工程、计算机应用等专业均已开设了机器学习和深度学习…

「网络编程」传输层协议_ TCP协议学习_及原理深入理解(一)[万字详解]

「前言」文章内容大致是传输层协议&#xff0c;TCP协议讲解&#xff0c;续上篇UDP协议。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、TCP协议介绍二、TCP协议2.1 解包与分用2.2 谈谈可靠性2.3 TCP的工作模式2.4 确认应答(ACK)机制2.5 16位序号与…

绘出「星辰大海」:华为云Astro轻应用新手指南-第二章

第2章 Astro轻应用奇遇——用鼠标「拖拽」的开发 不被编程所困&#xff0c;像玩拼图一样打造订购系统&#xff01; 今天&#xff0c;我们用鼠标拖拽的方式开发订餐应用。 读过本章&#xff0c;你可以同理开发出各异的订购小程序。 继续Astro轻应用旅行吧&#xff01; 第1站…