Руководство по заказу гуавы
1. обзор
В этой статье мы рассмотрим классOrdering из библиотеки Guava.
КлассOrdering реализует интерфейсComparator и дает нам полезный свободный API для создания и связывания компараторов.
В качестве небольшого отступления стоит также взглянуть на новый APIComparator.comparing(), который предоставляет аналогичные функции; here’s a practical example с помощью этого API.
2. СозданиеOrdering
Ordering имеет полезный метод построения, который возвращает правильный экземпляр, который можно использовать в методеsort() для коллекций или где-либо еще, где требуется экземплярComparator.
Мы можем создать экземпляр естественного порядка, выполнив метод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
Одна полезная особенность этого класса заключается в том, что мы можем связывать различные способы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(). Из-за этого результирующая отсортированная коллекция будет иметь объектPerson, который имеетnull как полеage в начале списка.
В конце процесса сортировки поляage сравниваются с использованием естественного порядка, указанного с помощью методаnatural().
4. Заключение
В этой статье мы рассмотрели классOrdering из библиотеки Guava, который позволяет нам создавать более плавные и элегантныеComparators. Мы создали свои собственныеOrdering,, мы использовали предопределенные из API, и мы связали их в цепочку, чтобы добиться большего пользовательского порядка.
Реализация всех этих примеров и фрагментов кода можно найти вthe GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.