1. 概要

この記事では、GuavaライブラリからのOrderingクラスについて説明します。

Ordering クラスは、コンパレータインターフェイスを実装し、コンパレータを作成およびチェーンするための便利な流暢なAPIを提供します。

簡単な補足として、同様の機能を提供する新しいコンパレータ.comparing()APIも検討する価値があります。 そのAPIを使用した実際の例を次に示します。

2. 注文の作成

注文には、コレクションまたはコンパレータのインスタンスがある他の場所の sort()メソッドで使用できる適切なインスタンスを返す便利なビルダーメソッドがあります必要です。

メソッドnatural():を実行することにより、自然順序インスタンスを作成できます。

List<Integer> integers = Arrays.asList(3, 2, 1);

integers.sort(Ordering.natural());

assertEquals(Arrays.asList(1,2,3), integers);

Personオブジェクトのコレクションがあるとしましょう。

class Person {
    private String name;
    private Integer age;
    
    // standard constructors, getters
}

そして、そのようなオブジェクトのリストをageフィールドでソートしたいと思います。 カスタムOrderingを作成して、それを拡張することで、まさにそれを実行できます。

List<Person> persons = Arrays.asList(new Person("Michael", 10), new Person("Alice", 3));
Ordering<Person> orderingByAge = new Ordering<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return Ints.compare(p1.age, p2.age);
    }
};

persons.sort(orderingByAge);

assertEquals(Arrays.asList(new Person("Alice", 3), new Person("Michael", 10)), persons);

次に、 orderingByAge を使用して、 sort()メソッドに渡すことができます。

3. 連鎖注文

このクラスの便利な機能の1つは、さまざまな方法を連鎖させることができることです。 注文。 人のコレクションがあり、それを並べ替えたいとしましょうフィールドと持っているヌルリストの先頭にある年齢フィールドの値:

List<Person> persons = Arrays.asList(
  new Person("Michael", 10),
  new Person("Alice", 3), 
  new Person("Thomas", null));
 
Ordering<Person> ordering = Ordering
  .natural()
  .nullsFirst()
  .onResultOf(new Function<Person, Comparable>() {
      @Override
      public Comparable apply(Person person) {
          return person.age;
      }
});

persons.sort(ordering);
        
assertEquals(Arrays.asList(
  new Person("Thomas", null), 
  new Person("Alice", 3), 
  new Person("Michael", 10)), persons);

ここで注意すべき重要なことは、特定のOrderingが実行される順序です。順序は右から左です。 したがって、最初に onResultOf()が実行され、そのメソッドが比較するフィールドを抽出します。

次に、 nullFirst()コンパレータが実行されます。 そのため、結果のソートされたコレクションには、リストの先頭にageフィールドとしてnullを持つPersonオブジェクトが含まれます。

並べ替えプロセスの最後に、 age フィールドは、メソッド natural()を使用して指定された自然順序付けを使用して比較されます。

4. 結論

この記事では、より流暢でエレガントなコンパレータを作成できるGuavaライブラリからのOrderingクラスについて説明しました。 カスタムのOrderingを作成し、 APIから事前定義されたものを使用し、それらをチェーンしてより多くのカスタムオーダーを実現しました。

これらすべての例とコードスニペットの実装は、 GitHubプロジェクトにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。