Comparator.nullsFirst与null-safe-comparator [英] Comparator.nullsFirst with null-safe-comparator
本文介绍了Comparator.nullsFirst与null-safe-comparator的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想要一个空安全的比较器,但是它不起作用:
I want to have a null-safe comparator, but it does not work:
Comparator<Item> sort_high = (i1, i2)-> Double.compare(i2.getUser().getValue(), i1.getUser().getValue());
items.sort(Comparator.nullsFirst(sort_high));
但是,如果item.getUser().getValue()(或item.getUser())为null,我会得到一个NPE.
However, I get a NPE, if item.getUser().getValue() (or item.getUser()) is null.
at Item.lambda$1(Item.java:270)
at java.util.Comparators$NullComparator.compare(Comparators.java:83)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
at java.util.TimSort.sort(TimSort.java:220)
at java.util.Arrays.sort(Arrays.java:1438)
at java.util.List.sort(List.java:478)
怎么了?
推荐答案
nullsFirst
将处理null Item
s("i1
"),但是一旦找到两个有效对象,您的Comparator
为被调用,您需要处理内部null
引用.
nullsFirst
will take care of null Item
s ("i1
"), but once two valid objects are found, your Comparator
is invoked and you need to handle internal null
references.
在您的情况下,您可以使用类似以下内容的
In your case, you could use something like:
items.sort(
Comparator.nullsFirst(
Comparator.comparing(Item::getUser,
Comparator.nullsFirst(Comparator.comparingDouble(User::getValue))
)
)
);
(假设getValue()
返回double
)
但是我几乎不推荐这样复杂的代码.
But I hardly recommend such convoluted code.
这篇关于Comparator.nullsFirst与null-safe-comparator的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文