Gia*_*rzo 26 java sorting collections nullpointerexception
在Java中使用Collection.sort时,当其中一个内部对象为null时,我应该返回什么
例:
Collections.sort(list, new Comparator<MyBean>() {
public int compare(MyBean o1, MyBean o2) {
return o2.getDate().compareTo(o1.getDate());
}
});
Run Code Online (Sandbox Code Playgroud)
让我们说o2不是null而是o2.getDate()它是,所以我应该在添加空验证时返回1或-1或0吗?
Nik*_*bak 42
当然,这是你的选择.无论你写什么逻辑,它都会定义排序规则.所以'应该'在这里不是正确的词.
如果你想在任何其他元素之前出现null,那么这样的事情就可以了
public int compare(MyBean o1, MyBean o2) {
if (o1.getDate() == null) {
return (o2.getDate() == null) ? 0 : -1;
}
if (o2.getDate() == null) {
return 1;
}
return o2.getDate().compareTo(o1.getDate());
}
Run Code Online (Sandbox Code Playgroud)
use*_*038 24
在Java 8中,您还可以使用nullsFirst():
Comparator.nullsFirst(Date::compareTo).compare(dateOne, dateTwo);
Run Code Online (Sandbox Code Playgroud)
或者nullsLast():
Comparator.nullsLast(Date::compareTo).compare(dateOne, dateTwo);
Run Code Online (Sandbox Code Playgroud)
这些方法将排序null到开头或结尾.无论你考虑null比其他物体更大还是更小,都没有错误或正确.这完全取决于你,正如其他人已经说过的那样.
小智 11
取决于对象是否为 null,或者对象的内容是否为 null。
该对象为空:
import static java.util.Comparator.*;
List<Data> listOfData = Arrays.asList(
new Data("foo"),
null,
new Data("bar"),
new Data("nyu"));
listOfData.sort(nullsFirst(comparing(Data::getValue)));
listOfData.forEach(System.out::println);
//OUTPUT:
// null
// Data(bar)
// Data(foo)
// Data(nyu)
Run Code Online (Sandbox Code Playgroud)
对象的内容为空:
List<Data> listOfData = Arrays.asList(
new Data("foo"),
new Data(null),
new Data("bar"),
new Data("nyu"));
listOfData.sort(nullsFirst(
comparing(Data::getValue, nullsFirst(naturalOrder()))));
listOfData.forEach(System.out::println);
//OUTPUT:
// Data(null)
// Data(bar)
// Data(foo)
// Data(nyu)
Run Code Online (Sandbox Code Playgroud)