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

news2025/1/22 12:51:05

目录

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
    @NoArgsConstructor
    static class FirstVO {
        private Long id;
        private String name;
    }
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static 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 转换成 SecondVO
        List<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();

        // 修改转换之后的集合数据 newVoList
        newVoList.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.coloradmin.cn/o/1673715.html

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

相关文章

记录接口请求偶发504 Gateway Time-out问题

项目场景&#xff1a; 我们将服务部署到A公司服务器中&#xff0c;使用了共五台服务器&#xff0c;分别是&#xff1a;1.NG服务器 2.日志服务器 3.缓存服务器 4.应用服务器1 5.应用服务器2 。而请求过来首先到达的是他们的物理代理服务器&#xff0c;然后再转发请求到我们的ng…

【操作系统期末速成】​操作系统概述(定义|功能|特征)|发展阶段和分类|结构设计|概念补充

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;操作系统&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

springboot306基于Java的民宿管理系统(源码+包运行+配套LW+技术指导)

项目描述 临近学期结束&#xff0c;开始毕业设计制作&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉的困难吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于Java的民宿管理…

红黑树!!

文章目录 1.红黑树的概念2.红黑树的几种情况2.1 情况一&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红(p为parent&#xff0c;g为grandfather&#xff0c;u为uncle)2.2 情况二&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff…

论:即时战略RTS游戏的小地图采用 自下而上的汇报式 还是 自上而下的查找式?

关键词&#xff1a;RTS 小地图 游戏设计 思路 卫星 位置映射 阵营 更新 汇报 询问 UE4 UE5 Unreal Engine 前言 你是否想过类似红色警戒的战略小地图的要素是采用何种方式更新数据的。大量数据实时更新&#xff0c;考虑频率&#xff0c;运行效率&#xff0c;开发中如何选型&a…

EXECL小技巧

一、批量给某列添加单引号或者双引号 如下&#xff1a;D2列为需要添加引号的列&#xff0c;效果如下图 1.双引号 """"&D2&"""" 2.双引号后增加逗号 """"&D2&""""&&quo…

Android 高德地图 添加 天地图 卫星瓦片图片(解决高德地图部分地区放大后无卫星图片问题)

废话不多说&#xff0c;直接商代吗 高德地图的加载就不多说了&#xff0c;这个直接去高德官网看就行了 高德官网&#xff1a;概述-Android 地图SDK | 高德地图API 下面我们就说如何添加天地图瓦片图层 天地图官网&#xff1a;天地图API 1.先去天地图注册成为开发者 2.创建…

【C++】深度解析:用 C++ 模拟实现 String 类,探索其底层实现细节

目录 了解string类 string的内存管理 VS下string的结构 ​g下string的结构 string的模拟实现 string的构造函数 浅拷贝 深拷贝 string的遍历 重载 [] 下标访问 迭代器访问 reserve resize 增删查改 push_back() append和 insert和erase find substr swap 流插入…

java sql中 大于 小于 大于等于 小于等于 代替符号

在写java时sql会经常会忘记大于小于号的表示方法导致无法运行&#xff0c;总结一下 第一种方法&#xff1a; < &#xff1a;< < &#xff1a; < &#xff1a;> &#xff1a; > sql如下&#xff1a; create_at > #{startTime} and create_at < #{end…

【Docker学习】重启容器的docker restart

命令&#xff1a; docker container restart 描述&#xff1a; 重启一个或多个容器 用法&#xff1a; docker container restart [OPTIONS] CONTAINER [CONTAINER...] 别名&#xff1a; docker restart(docker的一些命令可以简写&#xff0c;docker restart就等同于docker cont…

(接上一篇linux rocky 搭建DNS高阶版)实现不同网段访问解析不同的服务器并加域

上一篇链接&#xff1a;linux rocky 搭建DNS服务和禁止AD域控DNS&#xff0c;做到独立DNS并加域-CSDN博客文章浏览阅读417次&#xff0c;点赞13次&#xff0c;收藏7次。使用linux rocky 搭建DNS服务&#xff0c;用于独立AD域控DNS存在&#xff0c;并且实现加域。https://blog.c…

解决Jmeter报错 :Error generating the report: java.lang.NullPointerException

当我们在使用命令行的方式来执行jmeter 脚本的时候&#xff0c;例如 ./jmeter -n -t /opt/jmeter/script/test.jmx -Juser50 -Jtime100 -l /opt/jmeter/script/restult2.jtl 上面脚本的含义解释如下&#xff1a; -n -t 通过命令行的方式执行脚本test.jmx -Juser50 并发用户…

【排序算法】之冒泡排序

一、算法介绍 冒泡排序&#xff08;Bubble Sort&#xff09;是一种基础的排序算法&#xff0c;它的主要思想是通过重复遍历待排序的列表&#xff0c;比较每对相邻的元素并根据需要交换它们&#xff0c;使得每一遍遍历都能将未排序的最大&#xff08;或最小&#xff09;元素“冒…

httpretty,一个神奇的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - HTTPretty。 Github地址&#xff1a;https://github.com/gabrielfalcao/HTTPretty 在现代软件开发中&#xff0c;API和微服务的测试是确保应用稳定性和功能正确性的关键环…

RAR:Retrieving And Ranking Augmented MLLMs for Visual Recognition

我的博客已全部迁往个人博客站点&#xff1a;oukohou.wang&#xff0c;敬请前往&#xff5e;&#xff5e; paper: RAR:Retrieving And Ranking Augmented MLLMs for Visual Recognitioncodes: https://github.com/Liuziyu77/RAR 一、闲言碎语 RAR&#xff0c;整体动机总结一下…

LeetCode2390从字符串中移除星号

题目描述 给你一个包含若干星号 * 的字符串 s 。在一步操作中&#xff0c;你可以&#xff1a;选中 s 中的一个星号。移除星号 左侧 最近的那个 非星号 字符&#xff0c;并移除该星号自身。返回移除 所有 星号之后的字符串。注意&#xff1a;生成的输入保证总是可以执行题面中描…

JAVA 项目<果园之窗>_完结

目录 1、前言&#xff1a;2、视频展示&#xff1a;3、环境配置&#xff1a;4、工程代码&#xff1a;5、原理&#xff1a;6、原理补充&#xff1a;7、综上&#xff1a; 1、前言&#xff1a; 因为没有足够的时间这个项目用的是别人搭好的框架&#xff0c;在此基础上做调整并根据前…

算法训练营第二十八天 | LeetCode 77 组合(剪枝优化)、LeetCode 216 组合总和III、LeetCode 17 电话号码的字母组合

LeetCode 77 组合&#xff08;剪枝优化&#xff09; 当我们到达某一层&#xff0c;后面的结点数已经不能满足条件时。可以进行剪枝操作。 代码如下&#xff1a; class Solution { private:vector<int> path;vector<vector<int>> res;void backtracking(in…

前端无样式id或者class等来定位标签

目录&#xff1a; 1、使用背景2、代码处理 1、使用背景 客户使用我们产品组件&#xff0c;发现替换文件&#xff0c;每次替换都会新增如下的样式&#xff0c;造就样式错乱&#xff0c;是组件的文件&#xff0c;目前临时处理的话就是替换文件时删除新增的样式&#xff0c;但是发…

机器学习中常用的几种距离——欧式、余弦等

目录 一、欧式距离&#xff08;L2距离&#xff09;二、曼哈顿距离&#xff08;L1距离&#xff09;三、汉明距离四、余弦相似度 一、欧式距离&#xff08;L2距离&#xff09; &#xff08;1&#xff09;二维空间的距离公式&#xff08;三维空间的在这个基础上类推&#xff09;&…