2017-03-15 46 views
1

我怎麼能改寫這個:的Java:重寫比較與λ - nullsafe

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); 
    } 
}; 

入λ?

check null value before sorting using lambda expression,我嘗試這樣做:

byRank = Comparator.nullsFirst(Comparator.comparing(Domain::getDomainRank)); 

然而,它失敗:

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) 

編輯:拉姆達失敗,即使我比較之前檢查null比較的對象:

Queue<Domain> topByRank = new PriorityQueue<>(TOP, byRank); 

... 

for (Domain domain : domains) { 
    if (domain == null) { // check here 
    continue; 
    } 
    topByRank.add(domain); // here it fails 
} 
+0

對於我所看到的d1或d2應爲null – freedev

+0

@freedev我檢查空對象(請參閱編輯)。非lambda版本的工作沒有失敗。它不會在d1.getDomainRank()或d2.getDomainRank()上失敗嗎? – Michal

+0

Comparator.comparing正在拋出NPE。你必須打開電話。請參閱http://stackoverflow.com/a/28500970/982149 – Fildor

回答

1

您的代碼將首先將null設置爲null Domain。如果你想檢查空排名,你需要使用這樣的:

Comparator.comparing(Domain::getDomainRank, Comparator.nullsFirst(Comparator.naturalOrder())) 

但請記住,這僅相當於原來的比較,如果等級不能低於0。否則,你要測試一個類似的表達:

Comparator.comparing(d -> d.getDomainRank() == null ? 0 : d.getDomainRank()) 

或者,你可能意味着在你的原始代碼中使用Float.MIN_VALUE而不是0。

+0

這就是它,並感謝您關於零邊界的警告。 – Michal

1

它守ld是:

Comparator.comparing(Domain::getDomainRank, 
      Comparator.nullsFirst(Comparator.naturalOrder())) 

因此,我們根據domainRank對列表進行排序。但是,我們將如何處理domainRank值爲空的Domain對象?我們將把它們保留在我們系列的首位: Comparator.nullsFirst(Comparator.naturalOrder())