迭代并验证Java 8中的两个对象列表

时间:2019-08-30 04:42:15

标签: java java-8

我有2个列表:

  • 列表1:Object1 (Empno1, Empname1,Salary1)

  • 列表2:Object2(Empno2, Empname2,Salary2) Object3(Empno3, Empname3,Salary3)

鉴于List1的大小与List2的大小不同。

我想遍历List1和List2,如果List1对象中的Empno与List2对象的Empno相同,那么我们必须验证List1对象中的Empname与List2对象的Empname

这是使用旧版Java的代码:

boolean flag=false;

  for(Object1 obj1:list1) {

    for(Object2 obj2:list2) {

      if(obj1.getEmpno()==obj2.getEmpno()) {

         if(obj1.getEmpname().equals(obj2. getEmpname())){

          flag=true;

      }

     }

   }

}

哪种是用java8实现此目的的最佳方法

2 个答案:

答案 0 :(得分:0)

找到另一个列表中是否存在一个确切对象的一种可能解决方案是:

boolean b = list1.parallelStream().anyMatch(s -> list2.contains(s));

就像@Kris也提到的那样,它需要实现equal方法,以便像这样覆盖您的Object类:

class Object1 {
    int empNo;
    String empName;

    @Override
    public boolean equals(Object obj) {
        return ((Object2)obj).empNo == this.empNo && 
                ((Object2)obj).empName.equalsIgnoreCase(this.empName);
    }

    @Override        
    public int hashCode() {
        int result = 17;
        result = 31 * result + Integer.valueOf(empNo).hashCode();
        result = 31 * result + this.empName.hashCode();
        return result;
    }
}

17 31哈希码的想法来自有效Java书籍,有关此信息的更多信息,请遵循:https://stackoverflow.com/a/299748/2137378

答案 1 :(得分:0)

只需使用Stream::anyMatch方法

boolean result = list1.stream()
            .anyMatch(o1 -> list2.stream()
                    .anyMatch(o2 -> o1.getEmpno() == o2.getEmpno()
                            && o1.getEmpname().equals(o2.getEmpname())));