上一文簡單對 java.util.Comparator
進行了說明,今天咱們來看看另外一個和它很是相似的接口 java.lang.Comparable
。java
Comparable
接口一樣只有一個抽象方法 int compareTo(T o)
,其規則和Comparator
的int compare(T o1, T o2)
相似。雖然它也能夠看做一個函數式接口,可是 Java 8 中並無將它標記爲函數式接口。說明設計者並不但願開發者將它做爲函數式接口來使用。否則就偏離了設計意圖,就像下面輸入一個字符串返回該字符串的長度。函數
// 符合語法可是不符合設計意圖的操做 Comparable<String> comparable = String::length;
一般狀況下Comparable
但願被做爲對象的一個特性來表達該對象的實例之間是相互比較的。好比電影有按照年份進行比較的特性。this
class Movie implements Comparable<Movie> { private double rating; private String name; private int year; // Used to sort movies by year public int compareTo(Movie m){ return this.year - m.year; } }
Comparable 一般用於天然排序,也就是元素自己是可比較的。
Comparator
和 Comparable
很類似,可是它們也是有一些不同的地方的,主要表如今:spa
Comparable
一般是對象自帶的比較屬性而 Comparator
一般是做爲「第三方」來比較。Comparable
須要被對象實現來做爲特性使用,而Comparator
更像是策略。java.lang
包下 ,一個在 java.util
下,這從側面也證實了第一條。總而言之,若是對象的排序須要基於天然順序(它自己是可比較的),則使用 Comparable
,而若是須要根據業務來對不一樣屬性進行排序,請使用 Comparator
。 設計
關注公衆號:Felordcn 獲取更多資訊
3d