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