Java 8 Comparator nullsFirst 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,则使用指定的值来确定顺序。如果指定的比较器是 ,则返回的比较器认为所有非空值都相等。
null
null
Comparator
null
此行:“如果两者都为非 null,则使用指定的用于确定顺序。Comparator
我对何时以及如何明确地设定自然秩序或何时推断它们感到困惑。