BeanUtil.copyProperties(source,target)拷贝List注意事项

一:抛出问题

import cn.hutool.core.bean.BeanUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String id;private String name;/* 用于存储用户的订单 */private List<Order> orders;@Data@AllArgsConstructor@NoArgsConstructorpublic static class Order{/* 订单ID */private String orderId;/* 订单名称 */private String orderName;}/*** BeanUtil.copyProperties(source,target)方法拷贝List类型数据时。对target对象中的List数据修改会影响到source对象中的List数据*/public static void main(String[] args) {User source = new User();source.setId("001");source.setName("001号用户");// 构建source对象orders数据List<Order> orders = new ArrayList();Order order = new Order();order.setOrderId("1");order.setOrderName("1号订单");orders.add(order);source.setOrders(orders);System.out.println("source = " + source); // 输出:User(id=001, name=001号用户, orders=[User.Order(orderId=1, orderName=1号订单)])// 构建拷贝对象User target = new User();// 属性拷贝BeanUtil.copyProperties(source,target);System.out.println("target = " + target); // 输出:User(id=001, name=001号用户, orders=[User.Order(orderId=1, orderName=1号订单)])// 对target对象中的orders集合数据进行修改,观察source对象中的orders集合数据是否会发送变化Order targetOrder = target.getOrders().get(0);targetOrder.setOrderId("2");targetOrder.setOrderName("2号订单");// 输出target对象System.out.println("target = " + target); // User(id=001, name=001号用户, orders=[User.Order(orderId=2, orderName=2号订单)])/*** 输出source对象*      发现source对象中的orders数据被修改了。原因在于对于List类型使用BeanUtil.copyProperties(source,target)方法重source拷贝数据到target时。target对象中的orders对象其实是source对象中orders对象的引用(本质上是同一个对象)*      所以出现了对target对象中List类型的orders对象数据修改同时也会影响到source对象中的List类型的orders数据。*/System.out.println("source = " + source); // User(id=001, name=001号用户, orders=[User.Order(orderId=2, orderName=2号订单)])}
}

二:解决方式

        已知上面对target对象中的List数据修改时会影响到source对象中的List数据;也清楚了出现这个问题的原因在于使用copyProperties方法拷贝List属性时只是将source中List的引用拷贝给target中的List(source和target对象中的List本质上为同一个对象);

import cn.hutool.core.bean.BeanUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String id;private String name;/* 用于存储用户的订单 */private List<Order> orders;@Data@AllArgsConstructor@NoArgsConstructorpublic static class Order{/* 订单ID */private String orderId;/* 订单名称 */private String orderName;}public static void main(String[] args) {User source = new User();source.setId("001");source.setName("001号用户");// 构建source对象orders数据List<Order> orders = new ArrayList();Order order = new Order();order.setOrderId("1");order.setOrderName("1号订单");orders.add(order);source.setOrders(orders);System.out.println("source = " + source); // 输出:User(id=001, name=001号用户, orders=[User.Order(orderId=1, orderName=1号订单)])// 构建拷贝对象User target = new User();// 属性拷贝BeanUtil.copyProperties(source,target);// 解决方式:使用copyToList拷贝List数据时会创建一个新的List而不是地址值引用(将创建出来新的List对象赋值给target中的List)List<Order> newOrders = BeanUtil.copyToList(source.getOrders(), Order.class);target.setOrders(newOrders);System.out.println("target = " + target); // 输出:User(id=001, name=001号用户, orders=[User.Order(orderId=1, orderName=1号订单)])// 对target对象中的orders集合数据进行修改,观察source对象中的orders集合数据是否会发送变化(不会)Order targetOrder = target.getOrders().get(0);targetOrder.setOrderId("2");targetOrder.setOrderName("2号订单");// 输出target对象System.out.println("target = " + target); // User(id=001, name=001号用户, orders=[User.Order(orderId=2, orderName=2号订单)])// 输出source对象System.out.println("source = " + source); // User(id=001, name=001号用户, orders=[User.Order(orderId=1, orderName=1号订单)])}
}

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

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

相关文章

【python】OpenCV—Tracking(10.1)

学习来自《Learning OpenCV 3 Computer Vision with Python》Second Edition by Joe Minichino and Joseph Howse 文章目录 检测移动的目标涉及到的 opencv 库cv2.GaussianBlurcv2.absdiffcv2.thresholdcv2.dilatecv2.getStructuringElementcv2.findContourscv2.contourAreacv2…

对比上次MySQL的DDL

MySQL的DDL未必都是可以快速完成的&#xff0c;那么Oracle同等场景下如何&#xff1f; 这个是在Oracle19C下的实验&#xff0c;特别说明。因为在Oracle11G下有些结论是不成立的。 表thousand有大约4000万行记录 SQL> set timing on; SQL> desc thousand; Name T…

css多行文本擦拭效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>多行文本擦拭效果</title><style>* …

C++编程||日期类,日期相减,实现日期的下一天 两个日期 相减 日期 + 天数 得到的日期

日期类&#xff0c;日期相减&#xff0c;实现日期的下一天 两个日期 相减 日期 天数 得到的日期 具体要求&#xff1a;实现类date,其中 构造函数包括year,month,day三个参数 重载两个date类…

亚信安全助力宁夏首个人工智能数据中心建成 铺设绿色算力安全底座

近日&#xff0c;由宁夏西云算力科技有限公司倾力打造&#xff0c;亚信安全科技股份有限公司&#xff08;股票代码&#xff1a;688225&#xff09;全力支撑&#xff0c;总投资达数十亿元人民币的宁夏智算中心项目&#xff0c;其一期工程——宁夏首个采用全自然风冷技术的30KW机…

在做程序员的道路上,你学会什么,让你的技术突飞猛进

先动脑&#xff0c;再动手&#xff01; 先动脑子把流程梳理清楚&#xff0c;关键流程&#xff0c;问题点解决掉&#xff0c;再进行开发&#xff0c;比什么都重要&#xff01; 很多新手程序员拿着需求就是一顿噼里啪啦敲代码&#xff0c;最后发现设计垃圾、代码一堆 bug、返工…

复刻桌面小电视【包含代码分析】

宗旨&#xff1a;开源、分享、学习、进步&#xff0c;生命不息&#xff0c;折腾不止。 复刻小电视 感谢各位大佬的开源项目&#xff0c;让我有了学习的机会&#xff0c;如果侵权&#xff0c;请联系我删除。本人能力有限&#xff0c;如果有什么不对的地方&#xff0c;欢迎指正…

c/c++串的链式操作

文章目录 1.链式串的定义2.初始化3.赋值为04.赋值操作5.打印操作6.源码 本篇博客中都是带头结点的串。 1.链式串的定义 这里的数据域是4个字节&#xff0c;是为了节省空间。 typedef struct StringNode{char ch[4]; //按串长分配存储区&#xff0c;ch指向串的基地址struct S…

C++引用、内联函数、auto关键字介绍以及C++中无法使用NULL的原因

文章目录 一、引用1.1 引用概念1.2 引用特性1.3 常引用1.4 使用场景1.4.1 做参数1.4.2做返回值 1.5 引用和指针的区别1.6 小结一下 二、内联函数2.1 内联的概念2.2 内联的特性2.3 【面试题】 三、auto关键字(C11)3.1 类型别名思考3.2 auto简介 四、auto的使用细则4.1 基于范围的…

【2024年美国大学生数学建模竞赛】完整解析+模型代码+技术文档

美赛思路预定 01 美赛赛中时间分配美赛时间安排比赛前2~3天第一天&#xff08;2号&#xff09;第二天&#xff08;3号&#xff09;第三天&#xff08;4号&#xff09;第四天&#xff08;5号&#xff09;第五天&#xff08;6号&#xff09;8&#xff1a;00~10&#xff1a;00 02 …

固态硬盘颗粒,让我们了解下SLC、MLC、TLC

前文提要 近些年SSD的市场越来越好&#xff0c;大家的家用PC也逐渐都转向速度更快&#xff0c;玩游戏更流程的SSD,反而更加推动了SSD厂商的生产种类&#xff0c;但是其实大家还是挺关注SSD盘的使用寿命&#xff0c;处理数据速度&#xff0c;以及更重要的价格&#xff0c;面对市…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之TextPicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextPicker组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不…

什么是回归测试?回归测试的类型和方法?

随着软件开发进程的进行&#xff0c;每一次的修改和更新都有可能引入新的问题和错误。为了确保产品质量和稳定性&#xff0c;需要进行回归测试。那么&#xff0c;什么是回归测试&#xff1f;本文将为您解答。 回归测试是指在软件代码、使用环境或产品需求发生改变时&#xff0…

【Oracle云】使用 boto3 访问 OCI 对象存储 (AWS S3协议兼容)

在现代云计算环境中&#xff0c;S3&#xff08;Simple Storage Service&#xff09;协议已经成为云对象存储的事实标准。它提供了简单、可扩展、高度耐用的存储解决方案&#xff0c;得到了广泛应用。Oracle Cloud Infrastructure&#xff08;OCI&#xff09;秉承着开放性和灵活…

C++初阶 类和对象(补充)

目录 一、友元 1.1什么是友元&#xff1f; 1.2如何使用友元&#xff1f; 1.3使用友元 1.4使用友元注意事项 二、初始化列表 2.1什么是初始化列表? 2.2为什么要有初始化列表&#xff1f; 2.3使用初始化列表 2.4注意事项 一、友元 1.1什么是友元&#xff1f; 友元是一…

大数据知识图谱之深度学习——基于BERT+LSTM+CRF深度学习识别模型医疗知识图谱问答可视化系统

文章目录 大数据知识图谱之深度学习——基于BERTLSTMCRF深度学习识别模型医疗知识图谱问答可视化系统一、项目概述二、系统实现基本流程三、项目工具所用的版本号四、所需要软件的安装和使用五、开发技术简介Django技术介绍Neo4j数据库Bootstrap4框架Echarts简介Navicat Premiu…

Windows Server 2003 DNS服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DNS服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 2.服务器搭建 3)安装Web服务器和DNS服务器 4)查看安装是否成功 5)这里直接配置DNS服务器了,Web服务器如何配置我已经发布过了 文章目录 Windows Serve…

长时间佩戴骨传导耳机会损害听力吗?骨传导耳机有什么优点?

如果是正常的使用&#xff0c;是不会对损伤听力的&#xff0c;如果错误的使用&#xff0c;比如说高音量使用&#xff0c;长时间也会出现一定的危害&#xff0c;而且骨传导耳机相比于传统耳机&#xff0c;其优点也要多一些&#xff0c;下面一起看下骨传导耳机都有哪些优点吧。 佩…

iOS 文件分割保存加密

demo只是验证想法&#xff0c;没有做很多异常处理 默认文件是大于1KB的&#xff0c;对于小于1KB的没有做异常处理demo中文件只能分割成2个&#xff0c;可以做成可配置的N个文件分割拼接还可以使用固定的二进制数据&#xff0c;拼接文件开头或结尾 不论哪种拼法&#xff0c;目的…

redis下载与安装教程(centos下)

文章目录 一&#xff0c;redis下载1.1上传到linux服务器上 二&#xff0c;redis安装2.1 安装依赖2.2 解压包2.3 编译并安装2.4 指定配置启动2.5 设置redis开机自启 一&#xff0c;redis下载 官网&#xff1a; https://redis.io1.1上传到linux服务器上 我用filezila上传到/us…