如何复制列表中的相同项目、更改 属性 值并将其添加到新列表?
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/
我有一个具有操作的项目列表。当前,操作 属性 设置为空。我想要做的是复制列表中的项目,更改其操作 属性 以删除字符串并将其添加到新列表中。我想用 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/