2017-12-05 18 views
1

例として、次の値と同じ値を持つ2つの従業員オブジェクトがあります。Javaの2つのオブジェクトを比較する方法8

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のオブジェクトを比較する方法が他にもありますか?

+3

をし、代わりに 'employee1.equals(employee2)'によって置き換えられたこの 'doCompareEmployees'メソッドを削除してください。 –

+1

標準オプションは 'Employee'に適切な' equals'メソッドを追加することです。それが不可能な場合、プロパティーによるチェックのための最良のアプローチも変更されていません。return employee1.getID()== employee2.getID())&& employee1.getName()。equals(employee2.getName())&& employee1.getSalary()== employee2.getSalary()); – Holger

+1

https://stackoverflow.com/questions/472626/how-to-generically-compare-entire-java-beansの可能な複製 – tkruse

答えて

1

オブジェクトに順序を定義したくない場合は、通常、コンパレータを記述しません。

クラスの等価性を定義する一般的な方法は、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); 
} 

ラムダ式では非常にエレガントなコードを書くことができますが、各問題の最適解はありません。

+0

私は今まで 'Objects.hash() 'について知りませんでした。これはすばらしいです:-) –

0

このLambdaEqualsユーティリティを確認できます。しかし、良い習慣として、あなたは最高のパフォーマンスのためにオーバーライドすることができます。 「equals」メソッドをオーバーライドすると、Comparator.comparingよりも高速になる可能性があります。

以下は、Hoopjeと同じオーバーライドの例ですが、わずかに異なります。 Employeeクラスで

equalsメソッドオーバーライドします:あなたの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 
} 
+0

'super.equals(0)' ??? – ZhekaKozlov

+0

@ZhekaKozlov申し訳ありませんが、私の悪い。 typo :) – Octtavius

+0

私はこれを 'this == o'に変更します – ZhekaKozlov

関連する問題