如何在Java 8中比较两个对象

时间:2017-12-05 14:34:10

标签: java java-8 compareobject

让我们举个例子,你有两个员工对象具有如下相同的值。

Employee employee1 = new Employee(1001, "Sam", 20000);
Employee employee2 = new Employee(1001, "Sam", 20000);
if(doCompareEmployees(employee1, employee2)){
    System.out.println("Both employee objects are same.");
}else{
    System.out.println("Both employee objects are not same.");
}

//Here is compare method using java 8.

private boolean doCompareEmployees(Employee employee1, Employee employee2) {
int returnValue = Comparator.comparing(Employee::getID)
    .thenComparing(Employee::getName)
    .thenComparing(Employee::getSalary)
    .compare(employee1, employee2);
    if (returnValue != 0){
        return false;
    }   
    return true;
}

我想知道,还有其他更好的方法来比较Java 8中的对象吗?

2 个答案:

答案 0 :(得分:3)

如果您不想在对象上定义排序,通常不会编写比较器。

定义类的相等性的典型方法是定义equals()hashCode()方法。要实现hashCode()Objects.hash()可以提供帮助(从Java 7开始提供)。

public int hashCode() {
    return Objects.hash(id, name, salary);
}

public boolean equals(Object o) {
    if (o == this) return true;
    if (o == null || o.getClass() != getClass()) return false;
    Employee e = (Employee) o;
    return id == e.id && salary == e.salary && Objects.equals(name, e.name);
}

尽管lambda表达式允许在某些情况下编写非常优雅的代码,但它们并不是解决每个问题的最佳解决方案。

答案 1 :(得分:0)

您可以查看此LambdaEquals实用程序。但是,作为一个好习惯,你应该坚持等于最重要的表现。覆盖“equals”方法可能比Comparator.comparing更快。

以下是与Hoopje提供的覆盖相同的示例,略有不同。

在Employee类中重写equals方法:

public class Employee {
.....
.....
@Override
public boolean equals(Object o) {
     if(super.equals(o)) {
         return true;
     }
    if(!(o instanceof Employee)) {
        return false
    }

    Employee otherEmployee = (Employee) o;

    return 
        id == otherEmplyee.getId &&
        name == otherEmplyee.getName() &&
        salary == otherEmplyee.getSalary;

}


//Use the equal method
if(emp1.equals(emp2) {
    //do something
}