Guia para pedidos de goiaba

Guia para pedidos de goiaba

1. Visão geral

Neste artigo, examinaremos a classeOrdering da biblioteca Guava.

A classeOrdering implementa a interfaceComparator e nos dá uma API fluente útil para criar e encadear comparadores.

Como uma nota rápida, também vale a pena olhar para a nova APIComparator.comparing() - que fornece funcionalidade semelhante; here’s a practical example usando essa API.

2. CriandoOrdering

Ordering tem um método construtor útil que retorna uma instância apropriada que pode ser usada em um métodosort() em coleções ou em qualquer outro lugar onde uma instância deComparator seja necessária.

Podemos criar uma instância de ordem natural executando o métodonatural():

List integers = Arrays.asList(3, 2, 1);

integers.sort(Ordering.natural());

assertEquals(Arrays.asList(1,2,3), integers);

Digamos que temos uma coleção de objetosPerson:

class Person {
    private String name;
    private Integer age;

    // standard constructors, getters
}

E queremos ordenar uma lista de tais objetos por campoage. Podemos criar nossoOrdering personalizado que fará exatamente isso estendendo-o:

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);

Então podemos usar nossoorderingByAgee passá-lo para o métodosort().

3. EncadeandoOrderings

Um recurso útil desta classe é que podemos encadear diferentes formas deOrdering. Digamos que temos uma coleção de pessoas e queremos classificá-la pelo campoagee temos valores de camponullidade no início de uma lista:

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);

O importante a notar aqui é a ordem em que determinadosOrderings são executados - a ordem é da direita para a esquerda. Portanto, primeiroonResultOf() é executado e esse método extrai o campo que queremos comparar.

Então, o comparadornullFirst() é executado. Por causa disso, a coleção classificada resultante terá um objetoPerson que possui umnull como um campoage no início da lista.

No final do processo de classificação, os camposage são comparados usando a ordem natural conforme especificado usando o métodonatural().

4. Conclusão

Neste artigo, examinamos a classeOrdering da biblioteca Guava, que nos permite criarComparators mais fluente e elegante. Criamos nossosOrdering, personalizados, usamos os predefinidos da API e os encadeamos para obter um pedido mais personalizado.

A implementação de todos esses exemplos e trechos de código pode ser encontrada emthe GitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.