Руководство по заказу Гуавы

Руководство по заказу гуавы

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, поэтому его должно быть легко импортировать и запускать как есть.