字节流生成的map进行remove报错分析

使用stream流生成的map进行remove操作会报错

当对stream生成的map进行remove操作时,代码报错,复现代码如下:

package com.test.testdemo01.service;import com.test.testdemo01.entity.dto.DemoData;
import org.junit.Test;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @author : xubin* @date : 2023/12/14* @description : 针对字节流生成的map存在移除问题,针对异常情况进行测试及提供解决方案*/
public class IterationDemo {/*** 测试使用字节流会造成报错*/@Testpublic void test1(){//数据准备List<DemoData> demoDataList = new ArrayList<>();DemoData demoData1 = new DemoData();demoData1.setName("zhangsan");demoData1.setSno(123);DemoData demoData2 = new DemoData();demoData2.setName("zhangsan");demoData2.setSno(456);DemoData demoData3= new DemoData();demoData3.setName("lisi");demoData3.setSno(123);demoDataList.add(demoData1);demoDataList.add(demoData2);demoDataList.add(demoData3);Map<String, List<DemoData>> collect = demoDataList.stream().collect(Collectors.groupingBy(DemoData::getName));for (String key : collect.keySet()){if ("lisi".equals(key)){collect.remove(key);}}}}

DemoData实体:

package com.test.testdemo01.entity.dto;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;import java.util.UUID;/*** @author : xubin* @date : 2022/11/21* @description :*/
@Data
public class DemoData {//设置excel表头名称@ExcelProperty("学生编号")private Integer sno;@ExcelProperty("学生的姓名")private String name;public static void main(String[] args) {System.out.println(UUID.randomUUID());}
}

报错详情:

java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)at java.util.HashMap$KeyIterator.next(HashMap.java:1469)at com.test.testdemo01.service.IterationDemo.test1(IterationDemo.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.ParentRunner.run(ParentRunner.java:413)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)Process finished with exit code -1

使用新建的hashmap没有这个问题的发生

代码:

package com.test.testdemo01.service;import com.alibaba.fastjson.JSON;
import com.test.testdemo01.entity.dto.DemoData;
import com.test.testdemo01.entity.dto.TbOrderSendFilePO;
import org.apache.commons.collections4.map.HashedMap;
import org.junit.Test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @author : xubin* @date : 2023/12/14* @description : 针对字节流生成的map存在移除问题,针对异常情况进行测试及提供解决方案*/
public class IterationDemo {/*** 使用普通hashmap没有这个问题*/@Testpublic void test3(){//数据准备List<DemoData> demoDataList = new ArrayList<>();DemoData demoData1 = new DemoData();demoData1.setName("zhangsan");demoData1.setSno(123);DemoData demoData2 = new DemoData();demoData2.setName("zhangsan");demoData2.setSno(456);DemoData demoData3= new DemoData();demoData3.setName("lisi");demoData3.setSno(123);demoDataList.add(demoData1);demoDataList.add(demoData2);demoDataList.add(demoData3);Map<String, List<DemoData>> collect = new HashedMap<>();List<DemoData> demoDataList1 = new ArrayList<>();demoDataList1.add(demoData1);demoDataList1.add(demoData2);List<DemoData> demoDataList2 = new ArrayList<>();demoDataList2.add(demoData3);collect.put("zhangsan",demoDataList1);collect.put("lisi",demoDataList2);System.out.println(JSON.toJSONString(collect));for (String key : collect.keySet()){if ("lisi".equals(key)){System.out.println("need delete");collect.remove(key);}}System.out.println(JSON.toJSONString(collect));}}

输出结果:

{"zhangsan":[{"name":"zhangsan","sno":123},{"name":"zhangsan","sno":456}],"lisi":[{"name":"lisi","sno":123}]}
need delete
{"zhangsan":[{"name":"zhangsan","sno":123},{"name":"zhangsan","sno":456}]}Process finished with exit code 0

使用迭代器避免这个问题的发生

修改后代码

package com.test.testdemo01.service;import com.alibaba.fastjson.JSON;
import com.test.testdemo01.entity.dto.DemoData;
import com.test.testdemo01.entity.dto.TbOrderSendFilePO;
import org.junit.Test;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @author : xubin* @date : 2023/12/14* @description : 针对字节流生成的map存在移除问题,针对异常情况进行测试及提供解决方案*/
public class IterationDemo {/*** 使用迭代器能够避免这个问题*/@Testpublic void test2(){//数据准备List<DemoData> demoDataList = new ArrayList<>();DemoData demoData1 = new DemoData();demoData1.setName("zhangsan");demoData1.setSno(123);DemoData demoData2 = new DemoData();demoData2.setName("zhangsan");demoData2.setSno(456);DemoData demoData3= new DemoData();demoData3.setName("lisi");demoData3.setSno(123);demoDataList.add(demoData1);demoDataList.add(demoData2);demoDataList.add(demoData3);Map<String, List<DemoData>> collect = demoDataList.stream().collect(Collectors.groupingBy(DemoData::getName));System.out.println(JSON.toJSONString(collect));Iterator<Map.Entry<String, List<DemoData>>> iterator1 = collect.entrySet().iterator();while (iterator1.hasNext()){Map.Entry<String, List<DemoData>> next = iterator1.next();if ("lisi".equals(next.getKey())){System.out.println("need delete");iterator1.remove();}}System.out.println(JSON.toJSONString(collect));}}

输出日志:

{"lisi":[{"name":"lisi","sno":123}],"zhangsan":[{"name":"zhangsan","sno":123},{"name":"zhangsan","sno":456}]}
need delete
{"zhangsan":[{"name":"zhangsan","sno":123},{"name":"zhangsan","sno":456}]}Process finished with exit code 0

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

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

相关文章

【数据结构】栈和队列超详解!(Stack Queue)

文章目录 前言一、栈1、栈的基本概念2、栈的实现&#xff08;数组实现&#xff09;3、栈的基本操作3.1 栈的结构设计3.2 栈常见的基本函数接口 4、栈的实现4.1 初始化栈4.2 栈的销毁4.3 入栈4.4 出栈4.5 判空4.6 长度4.7 获取栈顶元素 完整代码Stack.hStack.cTest.c 二、队列1、…

SQLAlchemy 第一篇

安装SQLAlchemy pip install SQLAlchemy查看当前版本 # 查看当前版本import sqlalchemyprint(sqlalchemy.__version__)2.0.23创建数据库连接 此处我们以pymysql为mysql的数据库驱动 安装pymysql pip install pymysqlfrom sqlalchemy import create_engine engine create_…

Next.js 的设计理念

Next.js 的设计理念&#xff1a;简洁、强大与高效 Next.js 是一个流行的 React 框架&#xff0c;由 Vercel 公司开发。它的设计理念是简洁、强大和高效&#xff0c;这种理念贯穿于 Next.js 的所有功能中。下面我们将深入探讨这三个设计理念。 简洁 Next.js 的一个核心设计理…

阿里云国际设置DDoS基础防护和原生防护攻击事件报警

通过事件报警您能够获知业务遭受的DDoS攻击事件&#xff0c;及时发现并修复问题&#xff0c;缩短故障处理时间&#xff0c;以便尽快恢复业务。本文介绍如何设置DDoS基础防护和原生防护攻击事件的报警通知。 报警方式说明 阿里云DDoS原生防护提供消息中心报警、云监控报警和日…

HTTP 500错误:服务器内部错误,原因及解决方案

大家好&#xff0c;今天我们来聊聊一个常见的问题——HTTP 500错误&#xff0c;也就是服务器内部错误。这个错误就像是一个神秘的魔法&#xff0c;时不时地出现在你的网页上&#xff0c;让你的用户和你在一片懵逼中互相猜疑。 首先&#xff0c;我们来了解一下这个错误。HTTP 5…

大力说企微入门系列第四课:规则设计

当公司的企业微信体系建立起来以后&#xff0c;相应的人员、角色、权限已经配置&#xff0c;接下来是否就可以开始进入运营阶段那。 理论上来说是可以的&#xff0c;但是可能会引起混乱。所谓没有规矩不成方圆&#xff0c;要想运营顺利&#xff0c;还需要一些规则的设计。 01…

查找两个总和为特定值的索引(蓝桥杯)

#include <stdio.h> int main(){int n;scanf("%d",&n);int s[n];for(int i 0 ; i < n ; i)scanf("%d",&s[i]);int k;scanf("%d",&k);int sum 0;int t0,h;int st[101]; for(int i 0 ; i < n ; i)st[i] 0; //标记数…

Python员工信息管理系统V2(python系列21)

前言&#xff1a;在python系列19&#xff0c;我们使用MVC架构初步完成员工信息管理系统&#xff0c;今天我们使用封装&#xff0c;继承&#xff0c;多态让我们的程序有隐藏的魅力&#xff0c;更加灵活&#xff0c;有扩展性。 实现的功能和python系列19一模一样&#xff0c;所以…

Springboot+Libreoffice集成开发

简介 LibreOffice 是一款功能强大的办公软件&#xff0c;默认使用开放文档格式 (OpenDocument Format , ODF), 并支持 *.docx, *.xlsx, *.pptx 等其他格式。 它包含了 Writer, Calc, Impress, Draw, Base 以及 Math 等组件&#xff0c;可用于处理文本文档、电子表格、演示文稿、…

垃圾回收 (GC) 在 .NET Core 中是如何工作的?

提起GC大家肯定不陌生&#xff0c;但是让大家是说一下GC是怎么运行的&#xff0c;可能大多数人都不太清楚&#xff0c;这也很正常&#xff0c;因为GC这东西在.NET基本不用开发者关注&#xff0c;它是依靠程序自动判断来释放托管堆的&#xff0c;我们基本不需要主动调用Collect(…

【论文阅读】O’Reach: Even Faster Reachability in Large Graphs

Hanauer K, Schulz C, Trummer J. O’reach: Even faster reachability in large graphs[J]. ACM Journal of Experimental Algorithmics, 2022, 27: 1-27. Abstract 计算机科学中最基本的问题之一是可达性问题&#xff1a;给定一个有向图和两个顶点s和t&#xff0c;s可以通过…

C++进阶学习:map和set的实现

我们知道set和map的底层其实是红黑树&#xff0c;在学习完红黑树这个数据结构之后&#xff0c;我们开始简单模拟实现一下这两个STL容器 目录 1.set和map的泛型编程思想 2.红黑树的结构 2.1.迭代器的实现 2.2.迭代器的 operator 2.3.迭代器的代码 2.4.set和map迭…

资产管理系统部署及库存告警

1.需求&#xff1a;对电脑&#xff0c;办公设备&#xff0c;耗材等做资产盘点和整理&#xff0c;并对库存预警。 2.选型&#xff1a;snipeit 3.部署 #!/bin/bash docker run -d -p 80:80 --name"snipeit" --env-filesnipeit.env --mount sourcesnipe-vol,dst/var/l…

鸿蒙OS应用开发之文本输入组件

前面学习了按钮组件的输入方式,它只能响应触摸输入,或者点击输入,而不能实现文本的输入,虽然它是主流的操作方式,但是很多时候还是需要文本的输入。比如登录邮箱需要输入用户帐号和密码,网上购物需要输入地址和电话号码等等。应用对这样的需求,就需要使用文本输入组件,…

【算法系列篇】递归、搜索和回溯(三)

文章目录 前言什么是二叉树剪枝1. 二叉树剪枝1.1 题目要求1.2 做题思路1.3 代码实现 2. 验证二叉搜索树2.1 题目要求2.2 做题思路2.3 代码实现 3. 二叉搜索树中第k小的元素3.1 题目要求3.2 做题思路3.3 代码实现 4. 二叉树的所有路径4.1 题目要求4.2 做题思路4.3 代码实现 前言…

(八)数组和函数实践:扫雷游戏

目录 1. 扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 1.2 游戏的分析和设计 1.2.1 数据结构的分析 1.2.2 文件结构设计 2. 扫雷游戏的代码实现 3. 如何生成用户版本 4. 完整的排雷程序 1. 扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 1&#xff09;使用控制台实现经典…

数据结构和算法-栈

数据结构和算法-栈 文章目录 数据结构和算法-栈1. 栈的介绍2. 栈的应用场景3. 栈的快速入门3.1 用数组模拟栈3.2 课堂作业-用链表模拟栈 4. 栈实现综合计算器4.1 课堂作业-加入小括号5. 栈的三种表达式-**前缀、中缀、后缀表达式(逆波兰表达式)**5.1 前缀表达式(波兰表达式)5.1…

中低压MOS 适用于电子烟等产品—— 较小的开关损耗 过流能力好

工作原理&#xff1a; 当用户在吸嘴处抽吸时&#xff0c;气流经过进气孔&#xff0c;穿 过电路板上方的咪头&#xff0c;咪头即产生电信号&#xff0c;驱 动芯片板&#xff0c;让电池供电给雾化芯&#xff0c;雾化芯中的 发热丝将电能转化成热能&#xff0c;当温度达到雾化液…

LeetCode-2487. 从链表中移除节点【栈 递归 链表 单调栈】

LeetCode-2487. 从链表中移除节点【栈 递归 链表 单调栈】 题目描述&#xff1a;解题思路一&#xff1a;可以将链表转为数组&#xff0c;然后从后往前遍历&#xff0c;遇到大于等于当前元素的就入栈&#xff0c;最终栈里面的元素即是最终的答案。解题思路二&#xff1a;递归&am…

【一步到位】汽车过户全攻略:轻松搞定,告别繁琐流程

校长车行是一家昆明二手车代办公司&#xff0c;今天我们要聊一聊一个让很多人头疼的问题——汽车过户。相信很多朋友在购买二手车或者需要将车辆转让给他人时&#xff0c;都会遇到这个繁琐的流程。那么&#xff0c;如何才能轻松搞定汽车过户呢&#xff1f;接下来&#xff0c;就…