Mic*_*hal 1 java comparison lambda
我怎样才能重写这个:
private Comparator<Domain> byRank;
...
byRank = new Comparator<Domain>() {
@Override
public int compare(Domain d1, Domain d2) {
float tmp1 = d1.getDomainRank() == null ? 0 : d1.getDomainRank();
float tmp2 = d2.getDomainRank() == null ? 0 : d2.getDomainRank();
return Float.compare(tmp1, tmp2);
}
};
Run Code Online (Sandbox Code Playgroud)
进入拉姆达?
根据使用 lambda 表达式排序之前检查空值,我尝试了以下操作:
byRank = Comparator.nullsFirst(Comparator.comparing(Domain::getDomainRank));
Run Code Online (Sandbox Code Playgroud)
但是,它失败了:
java.lang.NullPointerException: null
at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
at java.util.Comparators$NullComparator.compare(Comparators.java:83)
at java.util.PriorityQueue.siftUpUsingComparator(PriorityQueue.java:669)
at java.util.PriorityQueue.siftUp(PriorityQueue.java:645)
at java.util.PriorityQueue.offer(PriorityQueue.java:344)
at java.util.PriorityQueue.add(PriorityQueue.java:321)
Run Code Online (Sandbox Code Playgroud)
编辑:即使我在比较之前检查比较对象是否为 null,lambda 也会失败:
Queue<Domain> topByRank = new PriorityQueue<>(TOP, byRank);
...
for (Domain domain : domains) {
if (domain == null) { // check here
continue;
}
topByRank.add(domain); // here it fails
}
Run Code Online (Sandbox Code Playgroud)
它应该是:
Comparator.comparing(Domain::getDomainRank,
Comparator.nullsFirst(Comparator.naturalOrder()))
Run Code Online (Sandbox Code Playgroud)
所以我们根据 来对列表进行排序domainRank。但是我们要如何处理值为 nullDomain的对象呢?domainRank我们将把它们放在我们收藏的首位:
Comparator.nullsFirst(Comparator.naturalOrder())