Guide de la commande de goyave

Guide de commande de goyave

1. Vue d'ensemble

Dans cet article, nous examinerons la classeOrdering de la bibliothèque Guava.

La classeOrdering implémente l'interfaceComparator et nous donne une API fluide utile pour créer et chaîner des comparateurs.

En bref, il vaut également la peine de regarder la nouvelle APIComparator.comparing() - qui fournit des fonctionnalités similaires; here’s a practical example utilisant cette API.

2. Création deOrdering

Ordering a une méthode de générateur utile qui renvoie une instance appropriée qui peut être utilisée dans une méthodesort() sur des collections ou n'importe où ailleurs où une instance deComparator est nécessaire.

Nous pouvons créer une instance d'ordre naturel en exécutant la méthodenatural():

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

integers.sort(Ordering.natural());

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

Disons que nous avons une collection d’objetsPerson:

class Person {
    private String name;
    private Integer age;

    // standard constructors, getters
}

Et nous voulons trier une liste de ces objets par champage. Nous pouvons créer nosOrdering personnalisés qui feront exactement cela en l'étendant:

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

Ensuite, nous pouvons utiliser notreorderingByAge et le passer à la méthodesort().

3. ChaînageOrderings

Une caractéristique utile de cette classe est que nous pouvons enchaîner différentes manières deOrdering. Disons que nous avons une collection de personnes et que nous voulons la trier par le champage et avoir des valeurs de champ d'âgenull au début d'une liste:

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

La chose importante à noter ici est un ordre dans lequel desOrdering particuliers sont exécutés - l'ordre est de droite à gauche. Donc tout d'abordonResultOf() est exécuté et cette méthode extrait le champ que nous voulons comparer.

Ensuite, le comparateurnullFirst() est exécuté. Pour cette raison, la collection triée résultante aura un objetPerson qui a unnull comme champage au début de la liste.

À la fin du processus de tri, les champsage sont comparés en utilisant l'ordre naturel comme spécifié à l'aide de la méthodenatural().

4. Conclusion

Dans cet article, nous avons examiné la classeOrdering de la bibliothèque Guava qui nous permet de créer desComparator plus fluides et élégants. Nous avons créé nosOrdering,personnalisés, nous avons utilisé ceux prédéfinis de l'API, et nous les avons enchaînés pour obtenir un ordre plus personnalisé.

L'implémentation de tous ces exemples et extraits de code se trouve dansthe GitHub project - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.