グアバの注文の手引き

グアバの注文ガイド

1. 概要

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

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

簡単な補足として、同様の機能を提供する新しいComparator.comparing()APIも検討する価値があります。そのAPIを使用するhere’s a practical example

2. Orderingの作成

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

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

List 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 persons = Arrays.asList(new Person("Michael", 10), new Person("Alice", 3));
Ordering orderingByAge = new Ordering() {
    @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. チェーンOrderings

このクラスの便利な機能の1つは、Ordering.のさまざまな方法をチェーンできることです。たとえば、人物のコレクションがあり、それをageフィールドで並べ替え、nullの年齢フィールド値を設定するとします。リストの先頭:

List persons = Arrays.asList(
  new Person("Michael", 10),
  new Person("Alice", 3),
  new Person("Thomas", null));

Ordering ordering = Ordering
  .natural()
  .nullsFirst()
  .onResultOf(new Function() {
      @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);

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

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

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

4. 結論

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

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