【发布时间】:2018-08-27 11:58:31
【问题描述】:
我想从传入列表更新现有列表中的项目。
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。
【问题讨论】:
-
我怀疑你能找到比两个嵌套循环更优雅的解决方案。对于较大的列表,将一个列表转换为
Map并只执行一个循环是有道理的,但对于如此短的列表,它不会得到回报。 -
person 类是否只有三个字段?您想只更新另一个列表中的两个字段(姓名和年龄)吗?
-
@pvpkiran 嗨,它可能有更多字段。由于可能会更新任何字段,因此我想将新列表中的对象直接替换为旧列表。
-
缺少很多细节。如果更新列表中不存在某些 id 怎么办?我们谈论的清单有多大?
-
您所说的“操作员”是什么意思,您是否有理由要使用流?使用
Collection方法removeAll、retainAll和addAll。可能就足够了,并且可能有助于提高可读性。我认为,对于小型列表,性能不会有所不同。
标签: java arraylist lambda java-8 java-stream