Java复制列表元素修改action属性时出现值覆盖,是什么原因?
问题根因
你编写的代码没有创建原对象的独立副本,两次stream.collect操作得到的列表存储的都是newLeaders中符合条件对象的引用,所有修改操作作用在同一批对象实例上:
- 第一次遍历将对象的
action属性设置为delete - 第二次遍历修改的还是同一批对象,将
action覆盖为add
最终合并的两个列表实际保存的都是同一批被覆盖为add属性的对象引用,因此所有元素的action都为add。
修复方案
核心逻辑是为每个原对象生成两份独立的拷贝,再分别设置不同的action属性。首先你需要给Leader类新增拷贝构造方法,用来生成新的对象实例:
public class Leader { // 原有类属性 private String someNumber; private String projectName; private String action; private Date endDate; // 新增拷贝构造方法 public Leader(Leader source) { this.someNumber = source.getSomeNumber(); this.projectName = source.getProjectName(); this.endDate = source.getEndDate(); } // 原有getter、setter方法 }
再修改业务代码:
// 先筛选出符合条件的原对象 List<Leader> sourceLeaders = newLeaders.stream() .filter(l -> !"add".equals(l.getAction()) && l.getEndDate() == null) .collect(Collectors.toList()); List<Leader> resultList = new ArrayList<>(); // 生成action为delete的副本 sourceLeaders.forEach(source -> { Leader deleteCopy = new Leader(source); deleteCopy.setAction("delete"); resultList.add(deleteCopy); }); // 生成action为add的副本 sourceLeaders.forEach(source -> { Leader addCopy = new Leader(source); addCopy.setAction("add"); resultList.add(addCopy); });
修改后两份拷贝是完全独立的实例,修改action属性不会互相干扰,即可得到你预期的列表结构。
内容的提问来源于stack exchange,提问作者Euridice01
相关产品推荐
相关产品推荐

