关于java8的List的stream流的foreach()方法问题探究(坑)与替代方案

news2024/11/27 22:23:04

一、起因

今天发现线上系统出现了一个bug,

我有一个“定时任务”每天凌晨触发,任务内容:

① 定时调用的系统暴漏的接口,来定时获取List<Object>数据。
② 然后我会筛选出该List中符合条件的Object,对筛选出来的Object的某个属性进行修改
③ 最后将该List<Object>全部保存到数据库(包括修改和未修改的都保存下来)。

二、问题

发现定时执行的任务,每天触发成功了,也没有报错。但是定时任务中对List修改的值并没有全部生效。大多数都未修改成功,而偶尔修改的成功的还是获取的List<Object>中的部分数据。

三、解决

上网查阅一番,初步判断是因为使用了java8的Stream.foreach()来修改“流的源数据”导致的。官方文档中有说明:Stream (Java Platform SE 8 )

 其中,对参数有特别说明“a non-interfering action to perform on the elements”,意思是说,对元素执行的非干扰动作,即foreach中执行的方法不要修改“stream流的元数据”。

而官网有对no-interfering更进一步说明java.util.stream (Java Platform SE 8 )

大概意思:

永远不应该修改流的数据源。在流管道执行期间修改流的数据源可能会导致异常、不正确的答案或不一致的行为
如果要改,则看截图中的代码示例,可以在终端操作开始之前修改源,这些修改将反映在所覆盖的元素中。

所以,如果要修改List数据

  • 方式一:
    要么就如同官网说的,在List进入Stream处理之前改。
  • 方式二:
    要么使用List<Object> newList= list.stream().map(e -> e.setXXX("123")).collect(Collection.toList);
    这种map的方式最后使用collect()接一下,保存到一个新list中如果不使用collect接收并且保存到新list中,那么有些情况下会导致对List的修改无效
  • 方式三(推荐):
    要么直接使用list.foreach(e -> e.setXXX("123"))中间不需要Stream!!中间不需要Stream!!中间不需要Stream!!

 


参考链接:

Stream (Java Platform SE 8 )

java.util.stream (Java Platform SE 8 )

list.stream().foreach()和list.foreach()的对比_初Q,的博客-CSDN博客_list.stream().foreach

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

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

相关文章

数组类模板

要求&#xff1a;设计一个数组模板类&#xff08;MyArray&#xff09;&#xff0c;完成对不同类型元素的管理操作步骤设计头文件在 qtcreate下先创建03_code的项目&#xff0c;然后右键点击03_code添加新文件&#xff0c;点击头文件&#xff0c;点击Choose命名为 myarry.hpp&am…

产品运营︱用户活跃度低的解决方法

app用户活跃度低&#xff0c;产品拉新变现效率慢&#xff0c;这是运营app时难免会遇到的情况。要想解决这类问题&#xff0c;就要从可能的原因下手&#xff0c;进行产品的优化改进&#xff0c;记录下改变后的关键数据变化&#xff0c;定期做好复盘工作进行调整。 一、app用户量…

117.Android 简单的拖拽列表+防止越界拖动(BaseRecyclerViewAdapterHelper)

//1.第一步 导入依赖库和权限&#xff1a; //依赖库&#xff1a; //RecyclerView implementation com.android.support:recyclerview-v7:28.0.0//RecyclerAdapter implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28 //用到的权限&#xff1a; <!…

【华为OD机试模拟题】用 C++ 实现 - 求最大数字

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

优思学院:六西格玛管理的优势有哪些?

六西格玛的优势有哪些呢&#xff1f;以下我们来探讨一下。 一・降低企业整体成本 对企业而言&#xff0c;不良品要么被废弃&#xff0c;要么需要重新加工&#xff0c;或者需要在客户现场维修或更换&#xff0c;这些都会增加企业成本。根据美国的统计数据&#xff0c;执行3σ管…

搭建Scala集成开发环境

文章目录前言搭建Scala集成开发环境&#xff08;一&#xff09;启动IDEA&#xff08;二&#xff09;安装Scala插件&#xff08;四&#xff09;创建Scala项目1、创建Scala项目 - ScalaDemo012、创建Scala类 - HelloWorld3、创建Scala单例对象 - TestHelloWorld&#xff08;五&am…

HIVE 基础(四)

目录 分桶&#xff08;Bucket&#xff09; 设定属性 定义分桶 案例 建表语句 表数据 上传到数据 创建分桶语句 加载数据 分桶抽样&#xff08;Sampling&#xff09; 随机抽样---整行数据 随机抽样---指定列 随机抽样---百分比 随机抽样---抽取行数 Hive视图&#…

计算机基础知识——认识寄存器

下面我们就来介绍一下关于寄存器的相关内容。我们知道&#xff0c;寄存器是 CPU 内部的构造&#xff0c;它主要用于信息的存储。除此之外&#xff0c;CPU 内部还有运算器&#xff0c;负责处理数据&#xff1b;控制器控制其他组件&#xff1b;外部总线连接 CPU 和各种部件&#…

【软件测试】自动化测试的科幻大片,揭开面纱的后背......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 只要一听到 “自动化…

Solon v2.1.4 发布。支持 java、kotlin、groovy!

本次发布&#xff0c;重点测试和验证了在 java、kotlin、groovy 三种 jvm 语言里&#xff0c;开箱即用的特性。并发布 Solon Initializr&#xff1a; https://solon.noear.org/start/ &#xff08;也即将发布 idea 插件&#xff09; 最近&#xff0c;与小诺开源团队合作发布了…

JS中如何将一个普通对象转换为可迭代对象,并且可使用for...of迭代对象,内含手写一个简单的迭代器

文章目录一、认识迭代器二、为类数组添加迭代器方法三、为colorObj对象添加迭代器方法四、优化colorObj代码五、ES6内置迭代对象方法这里有一个普通对象&#xff1a; const colorObj {white: "小白",black: "小黑",gray: "小灰", }如何对 colo…

hyper-v安装koolshare软路由

注意 windows更改适配器配置&#xff0c;为hostonly适配器配置两个IP hyper-v虚拟机内存设置为2G&#xff08;windows pe启动需要&#xff09; hyper-v虚拟机配置网络》选择hostonly网络 以管理员身份运行IMG写盘工具 BIOS从IDE启动 去掉DVD驱动器 添加硬件》网络适配器》wan网…

华为机试题:HJ84 统计大写字母个数(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

10 种主数据模型设计示例分享,推荐收藏

主数据模型是主数据管理的基础&#xff0c;一个完整的、可扩展的、相对稳定的主数据模型对于主数据管理的成功起着重要的作用。规划、创建主数据模型的过程&#xff0c;是梳理主数据管理体系的过程&#xff0c;目的是建立一个良好的资源目录结构&#xff0c;划分合理的资源粒度…

网关的通用设计框架

概念 网关&#xff0c;很多地方将网关比如成门&#xff0c; 没什么问题&#xff0c; 但是需要区分网关与网桥的区别。 网桥:工作在数据链路层&#xff0c;在不同或相同类型的LAN之间存储并转发数据帧&#xff0c;必要时进行链路层上的协议转换。可连接两个或多个网络&#xf…

从0到1一步一步玩转openEuler--22 管理服务-关闭、暂停、休眠系统服务

文章目录22 管理服务-关闭、暂停、休眠系统服务22.1 systemctl命令22.2 关闭系统22.3 重启系统22.4 使系统待机22.5 使系统休眠22 管理服务-关闭、暂停、休眠系统服务 22.1 systemctl命令 systemd通过systemctl命令可以对系统进行关机、重启、休眠等一系列操作。当前仍兼容部…

WSO2 apim 多租户来区分api

WSO2 apim 多租户来区分api1. Tenant1.1 Add new tenant1.2 Add Role/User1.3 Published Api2. Delete Teant3. AwakeningWSO2安装使用的全过程详解: https://blog.csdn.net/weixin_43916074/article/details/127987099. Official Document: Managing Tenants. 1. Tenant 1.1 …

电脑常用知识与工作常用工具

什么是电脑快捷键&#xff1f; 所谓快捷键就是使用键盘上某一个或某几个键的组合完成一条功能命令&#xff0c;从而达到提高操作速度的目的。 键盘布局 主键盘区&#xff0c;数字辅助键盘区、F键功能键盘区、控制键区&#xff0c;对于多功能键盘还增添了快捷键区 一、常用快捷…

多线程Thread常用方法和状态

Thread类 及常见方法 1、常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象&#xff0c;并命名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象&#xff0c;并命名Thre…

微信银行卡如何解除绑定?图文教程,快速解除

随着移动支付的普及&#xff0c;微信支付成为人们生活中不可或缺的支付方式。在微信支付中绑定银行卡可以让用户更方便地进行支付&#xff0c;但有时候需要解除银行卡的绑定。那么&#xff0c;微信银行卡如何解除绑定呢&#xff1f;在本文中&#xff0c;小编将详细介绍微信解除…