Java >> Java tutorial >  >> Tag >> java.util

Komparator for valgfri<T> med nøgleudtrækker, som java.util.Comparator.comparing

Du kan bruge Comparator#comparing(Function,Comparator) :

Accepterer en funktion, der uddrager en sorteringsnøgle fra en type T , og returnerer en Comparator<T> der sammenlignes med den sorteringsnøgle ved hjælp af den angivne Comparator .

Her er et eksempel baseret på koden i dit spørgsmål:

persons.sort(comparing(Person::getLastName, comparing(Optional::get)));

Grundlæggende er dette at bruge indlejrede nøgleudtrækkere til i sidste ende at sammenligne String objekter, der repræsenterer efternavnene. Bemærk, at dette vil forårsage en NoSuchElementException skal kastes, hvis enten Optional er tom. Du kan oprette en mere kompliceret Comparator for at håndtere tomme Optional s 1 :

// sort empty Optionals last
Comparator<Person> comp =
    comparing(
        Person::getLastName,
        comparing(opt -> opt.orElse(null), nullsLast(naturalOrder())));
persons.sort(comp);

Hvis du har brug for at gøre dette meget, så overvej at oprette hjælpemetoder på en måde, der ligner Comparator#nullsFirst(Comparator) og Comparator#nullsLast(Comparator) 1 :

// empty first, then sort by natural order of the value
public static <T extends Comparable<? super T>> Comparator<Optional<T>> emptyFirst() {
  return emptyFirst(Comparator.naturalOrder());
}

// empty first, then sort by the value as described by the given
// Comparator, where passing 'null' means all non-empty Optionals are equal
public static <T> Comparator<Optional<T>> emptyFirst(Comparator<? super T> comparator) {
  return Comparator.comparing(opt -> opt.orElse(null), Comparator.nullsFirst(comparator));
}

// empty last, then sort by natural order of the value
public static <T extends Comparable<? super T>> Comparator<Optional<T>> emptyLast() {
  return emptyLast(Comparator.naturalOrder());
}

// empty last, then sort by the value as described by the given
// Comparator, where passing 'null' means all non-empty Optionals are equal
public static <T> Comparator<Optional<T>> emptyLast(Comparator<? super T> comparator) {
  return Comparator.comparing(opt -> opt.orElse(null), Comparator.nullsLast(comparator));
}

Som så kan bruges som:

persons.sort(comparing(Person::getLastName, emptyLast()));

1. Eksempelkode forenklet baseret på forslag fra @Holger. Tag et kig på redigeringshistorikken for at se, hvordan koden så ud før, hvis du er nysgerrig.


Java tag