Java 8 Comparator nullFirst naturalOrder перепутан

это может быть простой вопрос, но я хотел бы понять это ясно ...

У меня есть такой код:

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+'}';}    
 }

И я тестирую этот код:

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}

Эти результаты меня устраивают, но у меня проблемы с пониманием.

Когда я игнорируюnew Persona(5,null) Объект и передать компаратор:

final Comparator<Persona>comparator = comparing(Persona::getName);

Отлично работает. Моя сортировка поnatural order of name property, Проблема возникает, когда я добавляю объект сname=nullЯ просто подумал, что мне нужен мой компаратор, как это.

final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst());

Моя мысль былаошибочный: "ОК, если имя не нулевое, они сортируются вnatural order of nameтак же, как предыдущий компаратор, и если ониnull они будут первымино мои ненулевые имена все равно будут отсортированы в естественном порядке».

Но правильный код таков:

final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));

Я не понимаю параметр дляnullsFirst, Я просто подумалnatural order of name явно [по умолчанию] даже обрабатыватьnull ценности.

Но документы говорят:

Возвращает нулевой дружественный компаратор, который считаетnull быть меньше, чем ненулевой. Когда обаnullони считаются равными. Если оба не равны NULL, указанныйComparator используется для определения порядка. Если указанный компараторnull, тогда возвращенный компаратор считает все ненулевые значения равными.

Эта строка: «Если оба ненулевые, указаннаяComparator используется для определения порядка. "

Меня смущает, когда и как следует явно устанавливать естественный порядок или когда они выводятся.

Ответы на вопрос(3)

Ваш ответ на вопрос