グアバの注文ガイド
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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。