Java 8 Comparator nullsFirst naturalOrder verwechselt
dies mag eine einfache Frage sein, aber ich möchte es klar verstehen ...
Ich habe einen Code wie diesen:
public final class Persona
{
private final int id;
private final String name
public Persona(final int id,final String name)
{
this.id = id;
this.name = name;
}
public int getId(){return id;}
public String getName(){return name;}
@Override
public String toString(){return "Persona{" + "id=" + id + ", name=" + name+'}';}
}
Und ich teste diesen Code:
import static java.util.Comparator.*;
private void nullsFirstTesting()
{
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
final List<Persona>persons = Arrays.asList(new Persona(1,"Cristian"),new Persona(2,"Guadalupe"),new Persona(3,"Cristina"),new Persona(4,"Chinga"),new Persona(5,null));
persons
.stream()
.sorted(comparator)
.forEach(System.out::println);
}
Dies zeigt die folgenden Ergebnisse:
Persona{id=5, name=null}
Persona{id=4, name=Chinga}
Persona{id=1, name=Cristian}
Persona{id=3, name=Cristina}
Persona{id=2, name=Guadalupe}
Diese Ergebnisse sind für mich in Ordnung, aber ich habe ein Problem mit dem Verständnis.
Wenn ich das @ ignorienew Persona(5,null)
Objekt und ich übergebe den Komparator:
final Comparator<Persona>comparator = comparing(Persona::getName);
Es wirkt wie ein Zauber. Meine Sortierung ist nachnatural order of name property
. Das Problem entsteht, wenn ich das Objekt mit @ hinzufüname=null
, Ich dachte nur, ich würde meinen Komparator so brauchen.
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst());
Mein Gedanke war fehlerhaft: "OK, wenn name nicht null ist, werden sie in @ sortienatural order of name
, genau wie der vorherige Komparator, und wenn sie @ sinull
Sie werden die Ersten seinaber meine nicht-null Namen werden immer noch in natürlicher Reihenfolge sortiert ".
Aber der richtige Code ist dieser:
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
Ich verstehe den Parameter nicht zunullsFirst
. Ich dachte nur dasnatural order of name
würde explizit [default] sogar mit @ umgehnull
Werte.
Aber die Dokumentation sagt:
Gibt einen nullfreundlichen Komparator zurück, der @ berücksichtignull
muss kleiner als null sein. Wenn beide @ sinull
, sie gelten als gleich. Wenn beide nicht null sind, wird das angegebeneComparator
wird verwendet, um die Reihenfolge zu bestimmen. Wenn der angegebene Komparator @ inull
, dann betrachtet der zurückgegebene Komparator alle Nicht-Null-Werte als gleich.
Diese Zeile: "Wenn beide nicht null sind, wird das angegebeneComparator
wird verwendet, um die Reihenfolge zu bestimmen. "
ch bin verwirrt, wann und wie die natürliche Reihenfolge explizit festgelegt werden sollte oder wann sie abgeleitet werde