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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage