dies eine einfache Frage sein, aber ich möchte es klar verstehen, ...Java 8 Vergleicher nullsFirst naturalOrder verwirrt
Ich habe einen Code wie folgt:
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 teste ich diesen Code Dies zeigt die folgenden Ergebnisse
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);
}
:
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 in Ordnung, aber ich habe ein Problem zu verstehen.
Wenn ich ignorieren die new Persona(5,null)
Objekt und gebe ich den Komparator:
final Comparator<Persona>comparator = comparing(Persona::getName);
Es funktioniert wie ein Charme. Meine Sortierung ist natural order of name property
. Das Problem tritt auf, wenn ich das Objekt mit name=null
hinzufüge, dachte ich nur, ich würde meinen Vergleicher so brauchen.
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst());
Mein Gedanke war irrtümliche: „OK, wenn der Name nicht-null ist, werden sie in natural order of name
, genau wie die vorherigen Komparator sortiert, und wenn sie null
sind, werden sie zuerst aber meine nicht sein Nullnamen werden weiterhin in natürlicher Reihenfolge sortiert. ".
Aber der richtige Code ist dies:
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
Ich verstehe nicht, den Parameter auf nullsFirst
. Ich dachte nur, die natural order of name
würde explizit [Standard] sogar null
Werte behandeln.
Aber die docs sagen:
Gibt einen Null freundlichen Komparator, die
null
weniger als nicht-null hält. Wenn beidenull
sind, gelten sie als gleich. Wenn beide nicht null sind, wird der angegebeneComparator
verwendet, um den Auftrag zu bestimmen. Wenn der angegebene Vergleichernull
, ist, berücksichtigt der zurückgegebene Vergleicher alle Nicht-Null-Werte als gleich.
Diese Zeile: "Wenn beide nicht null sind, wird die angegebene Comparator
verwendet, um die Reihenfolge zu bestimmen."
Ich bin verwirrt, wann und wie die natürliche Reihenfolge explizit festgelegt werden sollte oder wenn sie abgeleitet werden.
Hinweis * "Wenn der angegebene Komparator ist 'null', dann berücksichtigt der zurückgegebene Komparator alle Nicht-Null-Werte als gleich." * Mit anderen Worten, Sie können 'nullsFirst (null)'; es sortiert jedoch nur die Nullen nach vorne, ohne die Nicht-Nullen zu sortieren. Der Doc erklärt es eigentlich ziemlich gut. – Radiodef
@chiperotiz wie hast du es schließlich gelöst? Konnten Sie zuerst nach Nullen sortieren und dann nach Natural order? – Unheilig
ja mit diesem Code 'final Comparator comparator = Vergleichen (Persona :: getName, nullsFirst (naturalOrder()));' –
chiperortiz