複数のフィールドによるオブジェクトの比較
オブジェクト指向プログラミングでは、さまざまなフィールドに基づいてオブジェクトを比較することが望ましいことがよくあります。ただし、Comparable インターフェイスでは、単一のフィールドによる比較のみが可能です。
問題
フィールド firstName、lastName、および age を持つ Person クラスについて考えてみましょう。過剰なメソッドやオーバーヘッドを追加することなく、複数のフィールドでこれらのオブジェクトを比較する方法が必要です。
Java 8 ソリューション
Java 8 では、ラムダ式とメソッド参照が導入されました。カスタム コンパレータを簡単に作成できます:
Comparator<Person> comparator = Comparator.comparing((Person p) -> p.firstName) .thenComparing(p -> p.lastName) .thenComparingInt(p -> p.age);
このコンパレータは、まず firstName を比較し、次に lastName を比較します。
代替構文
Person クラスにフィールドのアクセサ メソッドがある場合、メソッド参照を使用してコンパレータを簡素化できます。
Comparator<Person> comparator = Comparator.comparing(Person::getFirstName) .thenComparing(Person::getLastName) .thenComparingInt(Person::getAge);
の使用コンパレータ
コンパレータを作成したら、次のように使用できます:
人物オブジェクトのコレクションを並べ替えるには:
List<Person> persons = ...; Collections.sort(persons, comparator);
2 人の人物を比較するにはオブジェクト:
Person p1 = ...; Person p2 = ...; int result = comparator.compare(p1, p2);
Comparable の実装
クラスを直接比較する必要がある場合 (ソートされたデータ構造で使用する場合など)、次のメソッドを使用して Comparable インターフェイスを実装できます:
@Override public int compareTo(Person o) { int result = Comparator.comparing(Person::getFirstName) .thenComparing(Person::getLastName) .thenComparingInt(Person::getAge) .compare(this, o); return result; }
Thisこのアプローチにより、オブジェクトの比較が簡素化され、複数の専用の比較メソッドの必要性が減ります。
以上が複数のフィールドに基づいて Java オブジェクトを比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。