gpt4 book ai didi

java - 使用流根据另一个列表更新一个列表

转载 作者:行者123 更新时间:2023-11-30 02:03:26 24 4
gpt4 key购买 nike

我想从传入列表中更新现有列表中的项目。

class Person{
String id;
String name;
String age;
.
.
.
@Override
public boolean equals(Object object) {
return ... ((Person) object).id.equals(this.id);
}
}

当前列表较短:

ArrayList<Person> currentList = Arrays.asList(
new Person("0", "A", 25),
new Person("1", "B", 35)
);

收到的列表更大,例如

ArrayList<Person> updatedList = Arrays.asList(
new Person("0", "X", 99),
new Person("1", "Y", 100),
new Person("2", "C", 2),
new Person("3", "D", 3),
new Person("4", "E", 5)
);

包括当前列表中的项目(由其 id 标识)。

我想用新列表中的相同项目替换当前列表中的所有项目。

所以转换后,当前列表将是

{ Person(0, "X", 99), Person(1, "Y", 100) }

是否可以仅使用 Stream 来完成。

最佳答案

如果currentList始终是 updatedList 的子集- 表示所有currentList将出现在 updatedList ,您可以执行以下操作:

Set<String> setOfId = currentList.stream()
.map(person -> person.getId()) // exctract the IDs only
.collect(Collectors.toSet()); // to Set, since they are unique

List<Person> newList = updatedList.stream() // filter out those who don't match
.filter(person -> setOfId.contains(person.getId()))
.collect(Collectors.toList());

如果updatedListcurrentList差异很大 - 两者都可以有独特的人,您必须进行两次迭代并使用 Stream::map替换 Person 。如果没有找到,则替换为 self:

List<Person> newList = currentList.stream()
.map(person -> updatedList.stream() // map Person to
.filter(i -> i.getId().equals(person.getId())) // .. the found Id
.findFirst().orElse(person)) // .. or else to self
.collect(Collectors.toList()); // result to List

关于java - 使用流根据另一个列表更新一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52038854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com