グアバの注文の手引き
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ベースのプロジェクトなので、簡単に実行できます。そのままインポートして実行します。