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
используется для определения порядка. "
Меня смущает, когда и как следует явно устанавливать естественный порядок или когда они выводятся.