Java 8 Comparator nullsPrimeiro naturalOrder confused
essa pode ser uma pergunta simples, mas eu gostaria de entender claramente ...
Eu tenho um código como este:
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+'}';}
}
E estou testando este código:
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);
}
Isso mostra os seguintes resultados:
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}
Esses resultados estão corretos comigo, mas tenho um problema de compreensão.
Quando eu ignoro onew Persona(5,null)
objeto e passo o comparador:
final Comparator<Persona>comparator = comparing(Persona::getName);
Ele funciona como um encanto. Minha classificação é pornatural order of name property
. O problema surge quando adiciono o objeto comname=null
, Pensei que precisaria do meu comparador assim.
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst());
Meu pensamento foierrôneo: "OK, quando o nome é não nulo, eles são classificados emnatural order of name
, assim como o comparador anterior, e se foremnull
eles serão os primeirosmas meus nomes não nulos ainda serão classificados em ordem natural"
Mas o código certo é este:
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
Eu não entendo o parâmetro paranullsFirst
. Eu apenas pensei que onatural order of name
explicitamente [padrão] até manipulanull
valores.
Mas os documentos dizem:
Retorna um comparador amigável para nulos que consideranull
ser menor que não nulo. Quando ambos sãonull
, eles são considerados iguais. Se ambos forem não nulos, o valor especificadoComparator
é usado para determinar a ordem. Se o comparador especificado fornull
, o comparador retornado considera que todos os valores não nulos são iguais.
Esta linha: "Se ambos forem não nulos, o valor especificadoComparator
é usado para determinar a ordem ".
Estou confuso quando e como a ordem natural deve ser explicitamente definida ou quando são inferidas.