如何复制列表中的相同项目、更改 属性 值并将其添加到新列表?

How can I duplicate the same items in list, change property values and add it to new list?

我有一个具有操作的项目列表。当前,操作 属性 设置为空。我想要做的是复制列表中的项目,更改其操作 属性 以删除字符串并将其添加到新列表中。我想用 add 再做一次。所以我们的想法是拥有相同项目的列表,但一个具有删除操作,另一个具有添加操作。

所以有一个包含这样的项目的列表:

{
            "someNumber": "123456",
            "projectName": "Foo Bar",
            "action": "delete"
        },
     {
            "someNumber": "454546",
            "projectName": "Foo Bar",
            "action": "delete"
        },
     {
            "someNumber": "123456",
            "projectName": "Foo Bar",
            "action": "add"
        },
     {
            "someNumber": "454546",
            "projectName": "Foo Bar",
            "action": "add"
        }

我复制了上面最初有 action = null 的 2 个项目,但现在有一个用于删除和添加。

我这里有这个代码片段:

List<Leader> leadersToDeleteForUpdating = newLeaders.stream().filter(l-> !"add".equals(l.getAction()) && l.getEndDate() == null).collect(toList());
leadersToDeleteForUpdating.forEach(l->l.setAction("delete"));

List<Leader> leadersToAddForUpdating = newLeaders.stream().filter(l-> !"add".equals(l.getAction()) && l.getEndDate() == null).collect(toList());
leadersToAddForUpdating.forEach(l->l.setAction("add"));

List<Leader> leadersToDeleteAndAddForUpdating = new ArrayList<>(leadersToDeleteForUpdating);
leadersToDeleteAndAddForUpdating.addAll(leadersToAddForUpdating);

现在,它正在使用 action = add 覆盖项目值,并且 action = delete 项目不会被复制。在这种情况下我做错了什么?

你得到所有项目的原因 add 是因为你一直在修改相同的对象。因此,您有两个对象,对于同样的两个对象,您首先将操作设置为 delete,然后将其设置为 add。所以当你添加两个列表时,两个列表是相同的,所以你最终得到 4 个带有 add 的项目(如果你从两个开始)。

一种简单的方法是克隆这些对象,并在流式传输列表时在每个对象上调用该克隆,如下所示:

public class Leader {
    private String someNumber;
    private String projectName;
    private String action;

    public Leader(String someNumber, String projectName, String action) {
        this.someNumber = someNumber;
        this.projectName = projectName;
        this.action = action;
    }

    public Leader clone() {
        return new Leader(this.getSomeNumber(), this.getProjectName(), this.getAction());
    }
}

然后当您进行流式传输时,映射并克隆它们:

List<Leader> leadersToDeleteForUpdating = newLeaders.stream().map(l-> l.clone()).filter(l-> !"add".equals(l.getAction())).collect(Collectors.toList());
leadersToDeleteForUpdating.forEach(l->l.setAction("delete"));

List<Leader> leadersToAddForUpdating = newLeaders.stream().map(l-> l.clone()).filter(l-> !"add".equals(l.getAction())).collect(Collectors.toList());
leadersToAddForUpdating.forEach(l->l.setAction("add"));

如果您想以更传统的方式执行此操作,可以使用 Cloneable 接口:https://www.geeksforgeeks.org/cloneable-interface-in-java/