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

相关推荐
编程学习0013 分钟前
记一次Java面试
java·面试
计算机学姐6 分钟前
基于SpringBoot+Vue的家政服务预约系统【个性化推荐+数据可视化】
java·vue.js·spring boot·后端·mysql·信息可视化·java-ee
一只大袋鼠6 分钟前
请求转发vs重定向、同源策略与跨域
java·javaweb·同源策略·请求转发·重定向
小胖java7 分钟前
基于LDA主题模型与情感分析的航空客户满意度分析
java·spring boot·spring
左左右右左右摇晃9 分钟前
Java并发——Lock锁
java·开发语言·笔记
森林里的程序猿猿10 分钟前
导致内存泄漏的ThreadLocal详解
java·jvm·数据结构
wangchunting11 分钟前
Java设计模式
java·单例模式·设计模式
Dream_sky分享17 分钟前
Excel模板下载(Resources目录下)
java·spring boot·后端
西海天际蔚蓝18 分钟前
线上环境接口访问转到本机的一套小工具
java·python
deviant-ART21 分钟前
为什么 Java 编译器要求 catch 块显式 return 或 throw
java·开发语言