Leitfaden für die Bestellung der Guave

1. Überblick

In diesem Artikel betrachten wir die Ordering -Klasse aus der Guava-Bibliothek.

Die Ordering -Klasse implementiert die Comparator -Schnittstelle und gibt uns eine nützliche API zum Erstellen und Verketten von Komparatoren.

Als Nebenanweisung lohnt sich auch ein Blick auf den neuen Comparator .comparing () API - die ähnliche Funktionen bietet; hier ist ein praktisches Beispiel , das diese API verwendet.

2. Erstellen von Ordering

Ordering verfügt über eine nützliche Builder-Methode, die eine ordnungsgemäße Instanz zurückgibt, die in einer sort () - Methode für Sammlungen oder an anderen Stellen verwendet werden kann, an denen eine Instanz von Comparator benötigt wird.

Wir können eine natürliche Ordnungsinstanz erstellen, indem wir die Methode natural () ausführen:

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

integers.sort(Ordering.natural());

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

Nehmen wir an, wir haben eine Sammlung von Person -Objekten:

class Person {
    private String name;
    private Integer age;

   //standard constructors, getters
}

Und wir möchten eine Liste solcher Objekte nach Feld age sortieren. Wir können unsere benutzerdefinierte Ordering erstellen, die genau das tut, indem wir sie erweitern:

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

Dann können wir unseren orderingByAge verwenden und an die sort () -Methode übergeben.

3. Verkettung von Orderings

Eine nützliche Funktion dieser Klasse ist, dass wir verschiedene Arten der Ordering-Methode verketten können. Angenommen, wir haben eine Sammlung von Personen, die wir nach age -Feld sortieren möchten und null__ age-Feldwerte am Anfang einer Liste haben:

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

Das Wichtigste, das Sie hier beachten sollten, ist eine Reihenfolge, in der bestimmte _Ordering s ausgeführt werden - Reihenfolge von rechts nach links. Zuerst wird onResultOf () _ ausgeführt und diese Methode extrahiert das Feld, das wir vergleichen möchten.

Dann wird nullFirst () Vergleicher ausgeführt. Aus diesem Grund verfügt die resultierende sortierte Auflistung über ein Person -Objekt, das am Anfang der Liste ein null als age -Feld hat.

Am Ende des Sortiervorgangs werden age -Felder unter Verwendung der natürlichen Reihenfolge verglichen, wie mit der Methode natural () angegeben.

4. Schlussfolgerung

In diesem Artikel haben wir uns die Ordering -Klasse aus der Guava-Bibliothek angesehen, mit der wir flüssigere und elegantere _ _Comparator s erstellen können. Wir haben unser benutzerdefiniertes Ordering erstellt, haben vordefinierte aus der API verwendet und sie verkettet, um mehr benutzerdefinierte Reihenfolge zu erreichen.

Die Implementierung all dieser Beispiele und Code-Snippets finden Sie unter https://github.com/eugenp/tutorials/tree/master/guavagliches GitHub-Projekt. Dies ist ein Maven-basiertes Projekt, daher sollte es einfach sein Importieren und ausführen, wie es ist.