How to compare two objects in Java 8

Sabarish.K picture Sabarish.K · Dec 5, 2017 · Viewed 16.3k times · Source

Lets take an example you have two employee object having same values as follows.

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;
}

I would like know about, is there any other better approach to compare objects in Java 8 ?

Answer

Hoopje picture Hoopje · Dec 6, 2017

If you do not want to define an ordering on your objects, normally you would not write a Comparator.

The typical way to define equality for a class, is to define both an equals() and a hashCode() method. To implement hashCode(), Objects.hash() can help (present since 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);
}

Although lambda expressions allow to write very elegant code in some cases, they are not the best solution for each problem.