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