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