2016-03-14 67 views
-1

到底是什麼的Collections.sort()以下過載:Collections.sort()適用於Comparable或Comparator?

sort(List<T> list, Comparator<? super T> c)

的要求作爲第二個參數?


例子:我開始爲7個隨機整數的列表:

List<Integer> listOfInts = new ArrayList<>(); 
Random rand = new Random(System.currentTimeMillis()); 
for (int i = 0; i < 7; i++) { 
    listOfInts.add(rand.nextInt()); 
} 

然後我嘗試使用Collections.sort()作爲對它們進行排序:

Collections.sort(listOfInts, Integer :: compare); 

還有:

Collections.sort(listOfInts, Integer :: compareTo); 

它們都是工作。 爲什麼不使用compareTo()排序集合的調用會拋出/失敗?compareTo()的簽名與compare()的簽名完全不同。

+0

http://stackoverflow.com/questions/420223/what-is-the-difference-between-compare-and-compareto – msadler

+0

我認爲你會對Java 8中引入的lambdas有些困惑。嘗試在Java 7中你將能夠輕鬆看到它。 –

+0

@msadler:給出相同答案的方法與方法相同。 'compare'比較兩件事物,而在一件事物上調用'compareTo'來比較另一件事物。我已經在我的問題的最後一行提到了它。無論如何,謝謝你在這裏鏈接這個答案。我在發佈這個問題之前閱讀了它,但它很好地鏈接了它。 – displayName

回答

1
Collections.sort(listOfInts, Integer::compare); 

是相當於舊Jav中的這段代碼答:

Collections.sort(list, new Comparator<Integer>() { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     return Integer.compare(o1, o2); 
    } 
}); 

雖然

Collections.sort(listOfInts, Integer::compareTo); 

相當於

Collections.sort(list, new Comparator<Integer>() { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     return o1.compareTo(o2); 
    } 
}); 

這裏沒有超載。方法sort需要第二個參數爲Comparator。它只是Java 8 lambda,它將它隱藏起來。

+0

你的回答對我有意義。如果可能的話,你能否詳細說明lambda *實際上是如何隱藏它的?沒有問題,如果你不能。 – displayName

+0

@displayName它們完全按照上圖所示隱藏它。你輸入'Integer :: compare',但它實際上創建了一個新的Comparator(),它的'compareTo(Integer o1,Integer o2)'方法的實現是'return Integer.compare(o1,o2);' –

2

您正在使用method references兩種類型。第一個是reference to a static method。第二個是reference to a type instance method。自動裝箱後,它們都具有相同的功能簽名(Integer, Integer) -> int

由於方法的引用都只是爲了lambda表達式語法糖,這裏是他們如何轉化爲lambda表達式:

Integer::compare評估爲

(int left, int right) -> Integer.compare(left, right) 

Integer::compareTo評估爲

(Integer left, Integer right) -> left.compareTo(right) 
+0

您的回答部分闡明瞭這一點。我不明白具有不同簽名的兩種方法如何被接受以對數據產生相同的效果?在進一步評論你的答案之前,會閱讀自動裝箱。 – displayName

+0

@displayName查看我的更新 – shmosel

+0

希望我能兩次投票。謝謝你的解釋。你的回答很清楚。 – displayName

相關問題