Java 从两个列表中的差异创建新列表

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<

我有一个包含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<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);
}
}
返回更新;
}