Java 从两个列表中的差异创建新列表
我有一个包含Person对象的数据库表。我的web服务接收更新此Person表的Person对象列表。我的应用程序现在包含两个列表:Java 从两个列表中的差异创建新列表,java,arraylist,Java,Arraylist,我有一个包含Person对象的数据库表。我的web服务接收更新此Person表的Person对象列表。我的应用程序现在包含两个列表: List<Person> current; List<Person> updated; fName和lName用于标识现有记录。下面是一个例子 当前 乔,布洛格斯,18岁,joe@me.com 简,布洛格斯,21岁,jane@me.com 弗洛,布洛格斯,25岁,flo@me.com private newList(List<
List<Person> current;
List<Person> updated;
fName和lName用于标识现有记录。下面是一个例子
当前
乔,布洛格斯,18岁,joe@me.com简,布洛格斯,21岁,jane@me.com
弗洛,布洛格斯,25岁,flo@me.com
private newList(List<Person> current, List<Person> new) {
List<Person> toUpdate = new ArrayList();
for(Person person : new) {
Person found = current.stream().filter(p->p.equals(person)).findFirst().orElse(person);
if (found.age!=person.age OR found.email!=person.email) {
toUpdate.add(person);
}
return toUpdate;
}
新的
乔,布洛格斯,18岁,乔_bloggs@me.com简,布洛格斯,21岁,jane@me.com
弗洛,布洛格斯,90岁,flo@me.com
private newList(List<Person> current, List<Person> new) {
List<Person> toUpdate = new ArrayList();
for(Person person : new) {
Person found = current.stream().filter(p->p.equals(person)).findFirst().orElse(person);
if (found.age!=person.age OR found.email!=person.email) {
toUpdate.add(person);
}
return toUpdate;
}
用于更新数据库的记录
乔,布洛格斯,18岁,乔_bloggs@me.com弗洛,布洛格斯,90岁,flo@me.com
private newList(List<Person> current, List<Person> new) {
List<Person> toUpdate = new ArrayList();
for(Person person : new) {
Person found = current.stream().filter(p->p.equals(person)).findFirst().orElse(person);
if (found.age!=person.age OR found.email!=person.email) {
toUpdate.add(person);
}
return toUpdate;
}
private newList(当前列表,新列表){
List toUpdate=new ArrayList();
适用于(个人:新){
找到的人员=current.stream().filter(p->p.equals(人员)).findFirst().orElse(人员);
if(find.age!=person.age或find.email!=person.email){
t更新。添加(人);
}
返回更新;
}
除非您重写Person类中的equals方法以实际检查字段,否则您需要检查对象的值而不是引用。下面是一个假设lname和fname用于标识记录的示例。
另外,对于相同的记录,我们不必将它们添加到列表中,这样我们的筛选方法将返回一个空对象,我们可以使用可选的方法来处理
一种更有效的方法是创建一个HashMap,其中fname和lname作为键,person对象作为值,这样就不必反复过滤,从而将运行时间减少n倍
private newList(List<Person> old, List<Person> updated) {
List<Person> toUpdate = new ArrayList<Person>();
for(Person person : old) {
Optional<Person> found =
updated
.stream()
.filter(p-> p.fname == person.fname
&& p.lname == person.lname &&
(p.email != person.email
|| p.age != person.age)).findFirst();
if(found.isPresent()) {
Person f = found.get();
toUpdate.add(f);
}
}
return toUpdate;
}
private newList(列表旧,列表更新){
List toUpdate=new ArrayList();
用于(人:旧){
找到的可选项=
更新
.stream()
.filter(p->p.fname==person.fname
&&p.lname==person.lname&&
(p.email!=person.email
||p.age!=person.age)).findFirst();
if(find.isPresent()){
Person f=found.get();
t更新。添加(f);
}
}
返回更新;
}