Comparator – thenComparing

Metoda thenComparing pozwala w łatwy sposób odwzorować sortowanie w silnikach baz danych (na przykład order by name, surname) – czyli sytuację gdzie najpierw chcemy posortować po polu A a następnie (posortowane elementy po polu A) po polu B.

Przykład

Załóżmy, że mamy następującą klasę:

class Person{
        private final String name;
        private final String surname;

        //constructor, getters, toString...
}

I chcemy posortować obiekty tej klasy na początku po nazwisku, a później po imionach:

public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Andrew", "Berry"));
        people.add(new Person("Patrick", "Berry"));
        people.add(new Person("Donna", "Ant"));
        people.add(new Person("Carmen", "Ant"));

        Comparator<Person> personComparator = 
            Comparator.comparing(Person::getSurname)
                .thenComparing(Person::getName);

        printPeople("Before sorting:", people);
        people.sort(personComparator);
        printPeople("After sorting:", people);
 }

Po posortowaniu powinniśmy otrzymać:

Before sorting:
Person{name='Andrew', surname='Berry'}
Person{name='Patrick', surname='Berry'}
Person{name='Donna', surname='Ant'}
Person{name='Carmen', surname='Ant'}
After sorting:
Person{name='Carmen', surname='Ant'}
Person{name='Donna', surname='Ant'}
Person{name='Andrew', surname='Berry'}
Person{name='Patrick', surname='Berry'}

Warto zajrzeć:

  1. https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
  2. Pełny kod przykładu https://github.com/damianradowiecki/thenComparing