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

目录

1.1、错误描述

(1)引入依赖

(2)模拟代码

(3)运行结果

1.2、解决方案


1.1、错误描述

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

(1)引入依赖

XML 复制代码
<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)模拟代码

java 复制代码
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的方式,创建一个新的集合,然后对这个新的集合数据进行修改。

java 复制代码
List<SecondVO> newVoListBak = new ArrayList<>(newVoList);

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

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

相关推荐
从心归零14 分钟前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius2 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe2 小时前
分布式系统实战经验
java·分布式
是梦终空2 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss3 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
码爸3 小时前
flink doris批量sink
java·前端·flink
Monodye3 小时前
【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)
java·网络·数据结构·算法·系统架构
一丝晨光3 小时前
逻辑运算符
java·c++·python·kotlin·c#·c·逻辑运算符
无名指的等待7124 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端