Java 8 Comparator nulls Primero natural Orden confundido
Esta puede ser una pregunta simple, pero me gustaría entenderla claramente ...
Tengo un 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+'}';}
}
Y estoy probando 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);
}
Esto muestra los siguientes 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}
Estos resultados están bien conmigo pero tengo un problema de comprensión.
Cuando ignoro elnew Persona(5,null)
objeto y paso el comparador:
final Comparator<Persona>comparator = comparing(Persona::getName);
Funciona a las mil maravillas. Mi clasificación es pornatural order of name property
. El problema surge cuando agrego el objeto conname=null
, Solo pensé que necesitaría mi comparador así.
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst());
Mi pensamiento eraerróneo: "OK, cuando el nombre no es nulo, se ordenan ennatural order of name
, al igual que el comparador anterior, y si sonnull
ellos serán los primerospero mis nombres no nulos aún se ordenarán en orden natural".
Pero el código correcto es este:
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
No entiendo el parámetro paranullsFirst
. Solo pensé que elnatural order of name
explícitamente [por defecto] incluso manejarnull
valores.
Pero los documentos dicen:
Devuelve un comparador nulo que consideranull
ser menos que no nulo. Cuando ambos sonnull
, se consideran iguales. Si ambos no son nulos, el especificadoComparator
se usa para determinar el orden. Si el comparador especificado esnull
, el comparador devuelto considera que todos los valores no nulos son iguales.
Esta línea: "Si ambos no son nulos, el especificadoComparator
se utiliza para determinar el orden ".
Estoy confundido sobre cuándo y cómo se debe establecer explícitamente el orden natural o cuándo se infieren.