使用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()方法转换集合对象,修改数据不生效的问题就解决啦。

相关推荐
腻害兔1 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨3 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说6 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19947 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了7 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品7 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘8 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记8 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端