使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录

1.1、错误描述

(1)引入依赖

(2)模拟代码

(3)运行结果

1.2、解决方案


1.1、错误描述

最近在开发过程中,使用到了com.google.common.collect依赖包,通过这个依赖包中提供的一些方法来操作集合,确实可以省下不少的时间。但是在使用Lists.transform()方法,将一种数据类型转换成另外一种数据类型的集合时候,接着在后面的业务代码中,对转换的新集合对象数据进行修改,居然发现修改不生效,返回给前端的数据仍然是最开始转换之后的集合数据。

(1)引入依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version>
</dependency>
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version>
</dependency>

(2)模拟代码

package com.gitcode.demo.google;import cn.hutool.core.bean.BeanUtil;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.ArrayList;
import java.util.List;/*** @author ZhuYouBin* @version 1.0.0* @date 2024/5/10 14:44* @description 集合工具类*/
public class CollectDemo {@Data@AllArgsConstructor@NoArgsConstructorstatic class FirstVO {private Long id;private String name;}@Data@AllArgsConstructor@NoArgsConstructorstatic class SecondVO {private Long id;private String name;private String remark;}public static void main(String[] args) {List<FirstVO> voList = new ArrayList<>();voList.add(new FirstVO(1L, "张三"));voList.add(new FirstVO(2L, "李四"));System.out.println("转换之前的数据:");voList.forEach(System.out::println);System.out.println();// 将 FirstVO 转换成 SecondVOList<SecondVO> newVoList = Lists.transform(voList, firstVO -> {SecondVO vo = new SecondVO();BeanUtil.copyProperties(firstVO, vo);System.out.println("执行Lists.transform方法的function,vo==>:" + vo.hashCode());return vo;});newVoList.forEach(ent -> {System.out.println("转换之后的数据:ent======>" + ent.hashCode());});System.out.println();// 修改转换之后的集合数据 newVoListnewVoList.forEach(secondVO -> {secondVO.setRemark("备注");System.out.println("修改转换之后的集合数据 newVoList,secondVO==>:" + secondVO.hashCode());});}
}

(3)运行结果

运行上面的代码,查看控制台输入日志,如下所示:

将修改remark字段的方法注释掉,再次查看输出日志,如下所示:

从上面就可以看出来啦,当我们使用Lists.transform()方法转换得到的集合对象,如果没有对其数据进行修改操作,只是遍历集合,那么返回的数据就是相同的,但是,如果有对其进行修改操作,那么此时Lists.transform()方法会创建一个新的对象,修改也只是这个新的对象的数据,不会影响转换的集合数据,可以理解为:修改的数据只是一个临时对象,并不是原对象。

1.2、解决方案

针对上面的情况,解决方案当然是,直接通过new的方式,创建一个新的集合,然后对这个新的集合数据进行修改。

List<SecondVO> newVoListBak = new ArrayList<>(newVoList);

再次执行代码,就可以发现修改成功,如下:

到此,Lists.transform()方法转换集合对象,修改数据不生效的问题就解决啦。

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

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

相关文章

Vue踩坑,less与less-loader安装,版本不一致

无脑通过npm i less -D安装less之后&#xff0c;继续无脑通过npm i less-loader -D安装less-loader出现如下错误&#xff1a; 解决方法&#xff1a; 1) npm uninstall less与 npm uninstall less-loader 2) 直接对其版本&#xff1a; npm i less3.0.4 -D npm i less-loader…

conda删除虚拟环境命令

conda删除虚拟环境命令 删除虚拟环境的命令可以使用conda命令的remove或者env remove子命令&#xff0c;具体的实现方法如下所示&#xff1a; 使用conda remove命令删除虚拟环境&#xff1a; conda remove --name <环境名称> --all 这将删除指定名称的虚拟环境…

Python进阶之-inspect模块详解

✨前言&#xff1a; Python中的inspect模块是用于获取对象的信息的模块&#xff0c;比如查看源代码、列出成员、检查类和函数的参数等&#xff0c;非常适用于调试和反射&#xff08;introspection&#xff09;。接下来&#xff0c;我会详细解释inspect模块&#xff0c;并结合例…

es关闭开启除了系统索引以外的所有索引

1、es 开启 “删除或关闭时索引名称支持通配符” 功能 2、kibanan平台执行 POST *,-.*/_close 关闭索引POST *,-.*/_open 打开索引3、其他命令 DELETE index_* // 按通配符删除以index_开头的索引 DELETE _all // 删除全部索引 DELETE *,-.* 删除全…

鸿蒙OpenHarmony开发板解析:【系统能力配置规则】

如何按需配置部件的系统能力 SysCap&#xff08;SystemCapability&#xff0c;系统能力&#xff09;是部件向开发者提供的接口的集合。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 部件配置系统…

Java入门——类和对象(上)

经读者反映与笔者考虑&#xff0c;近期以及往后内容更新将主要以java为主&#xff0c;望读者周知、见谅。 类与对象是什么&#xff1f; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对…

c#文心接口应用举例

"文心接口" 通常不是 C# 语言或生态系统中直接的一个术语&#xff0c;但我猜你可能是在提及百度的一个AI平台或API&#xff0c;比如百度的文心一言&#xff08;ERNIE Bot&#xff09;或其他与AI和NLP&#xff08;自然语言处理&#xff09;相关的服务。由于具体的文心…

DDOS攻击实战演示,一次DDOS的成本有多低?

DDoS攻击成本概览 分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其低廉的启动成本和惊人的破坏力著称。攻击者通过黑市轻松获取服务&#xff0c;成本从几十元人民币的小额支出到针对大型目标的数千乃至数万元不等。为了具体理解这一成本结构&#xff0c;我们将通过一个简…

机器学习【如何学习】

如何学习机器学习 机器学习是一门快速发展的学科&#xff0c;学习机器学习需要掌握一定的数据基础和编程能力。但是很多人一听到数学就头大&#xff0c;就退缩&#xff0c;导致想要学习的新已经有两三年了&#xff0c; 但是学习的行动一直在心里&#xff0c;迟迟没有落地&…

常见的TypeScript类型注解符号

1、: 用途: 用于指定类型。放在变量名或函数参数后面&#xff0c;紧接着是类型。 示例: let name: string "Alice";2、string, number, boolean, void, null, undefined 用途: 基本数据类型。分别表示字符串、数字、布尔值、无返回值、空值和未定义。 示例: func…

每日两题 / 226. 翻转二叉树 98. 验证二叉搜索树(LeetCode热题100)

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 以后续遍历的方式交换当前节点的左右指针 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), ri…

机器学习-12-sklearn案例03-flask对外提供服务

整体思路 训练一个模型&#xff0c;把模型保存 写一个基于flask的web服务&#xff0c;在web运行时加载模型&#xff0c;并在对应的接口调用模型进行预测并返回 使用curl进行测试&#xff0c;测试通过 再创建一个html页面&#xff0c;接受参数输入&#xff0c;并返回。 目录结…

Java使用equals和==的区别

对于在范围 -128 到 127 之间的数值&#xff0c;Java 会使用缓存的 Integer 对象。因此&#xff0c;这些数值的 Integer 对象可以使用 进行比较。 对于不在这个范围的数值&#xff0c;Java 每次可能创建一个新的 Integer 对象。这样&#xff0c;即使两个 Integer 对象代表相同…

CSS悬浮动画

<button class"btn">悬浮动画</button>.btn {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);padding: 10px 20px;width: 200px;height: 50px;background-color: transparent;border-radius: 5px;border: 2px solid powderblu…

C++继承深入解析

目录标题 1. 继承的基本概念1.1 为什么使用继承1.2 继承的语法 2. 继承的类型2.1 公共继承&#xff08;Public Inheritance&#xff09;公共继承的特性公共继承的语法公共继承的实际应用 2.2 保护继承&#xff08;Protected Inheritance&#xff09;保护继承的特性保护继承的语…

R2S+ZeroTier+Trilium

软路由使用ZeroTier搭建远程笔记 软路由使用ZeroTier搭建远程笔记 环境部署 安装ZeroTier安装trilium 环境 软路由硬件&#xff1a;友善 Nanopo R2S软路由系统&#xff1a;OpenWrt&#xff0c;使用第三方固件nanopi-openwrt。内网穿透&#xff1a;ZeroTier。远程笔记&…

银河麒麟操作系统 v10 离线安装 Docker v20.10.9

1查看系统版本 [rootweb-0001 ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION"V10 (Tercel)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Advanced Server V10 (Tercel)" ANSI_COLOR"…

pyqt动画效果放大与缩小

pyqt动画效果放大与缩小 QPropertyAnimation介绍放大与缩小效果代码 QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c;例…

服务器2080ti驱动的卸载与安装

服务器2080ti驱动的卸载与安装 前言1、下载驱动2、驱动卸载与安装2.1 卸载原来驱动2.2 安装新驱动 3、查看安装情况 前言 安装transformers库&#xff0c;运行bert模型时出错&#xff0c;显示torch版本太低&#xff0c;要2.0以上的&#xff0c;所以更新显卡驱动&#xff0c;重…

基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)全网首发【图像识别-天气分类】

一个能够从给定的环境图像中自动识别并分类天气&#xff08;如晴天、多云、雨天、雪天闪电等&#xff09;的系统。 技术栈&#xff1a; 深度学习框架&#xff1a;PyTorch基础模型&#xff1a;VGG16与EfficientNet任务类型&#xff1a;计算机视觉中的图像分类 模型选择 VGG16 …