1.概要

この記事では、Guavaライブラリーの

Ordering

クラスを調べます。


Ordering

クラスは

Comparator

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

ちょっとした補足として、新しいhttps://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.[

Comparator]もご覧ください。 .comparing()

]API – 同様の機能を提供します。

ここでは実用的な例です

そのAPIを使用しています。

2.

Ordering

を作成する


Ordering

には、コレクションの

sort()

メソッドや

Comparator

のインスタンスが必要な場所で使用できる適切なインスタンスを返す便利なビルダーメソッドがあります。

メソッド__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つは、さまざまな方法で

Orderingをチェインできることです。人の集まりがあり、それを

age

フィールドでソートし、

null__ ageフィールドの値をリストの先頭に置くとします。

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

クラスを見て、より流暢でエレガントな

__Comparator


sを作成できるようにしました。私たちはカスタムの

Orderingを作成し、APIから事前定義されたものを使用し、さらにカスタムオーダーを達成するためにそれらを連鎖させました。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/guava[the GitHub project]にあります。これはMavenベースのプロジェクトなので、簡単に実行できます。そのままインポートして実行します。