You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java复制列表元素修改action属性时出现值覆盖,是什么原因?

问题根因

你编写的代码没有创建原对象的独立副本,两次stream.collect操作得到的列表存储的都是newLeaders中符合条件对象的引用,所有修改操作作用在同一批对象实例上:

  1. 第一次遍历将对象的action属性设置为delete
  2. 第二次遍历修改的还是同一批对象,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:54:04