Java 中的 Comparator 和 Comparable

1. 前言

上一文簡單對 java.util.Comparator 進行了說明,今天咱們來看看另外一個和它很是相似的接口 java.lang.Comparablejava

2. Comparable

Comparable 接口一樣只有一個抽象方法 int compareTo(T o),其規則和Comparatorint 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 一般用於天然排序,也就是元素自己是可比較的。

3.Comparator vs Comparable

ComparatorComparable 很類似,可是它們也是有一些不同的地方的,主要表如今:spa

  • 視角不一樣,Comparable 一般是對象自帶的比較屬性而 Comparator 一般是做爲「第三方」來比較。
  • 一般 Comparable須要被對象實現來做爲特性使用,而Comparator 更像是策略。
  • 一個位於 java.lang 包下 ,一個在 java.util 下,這從側面也證實了第一條。

4. 總結

總而言之,若是對象的排序須要基於天然順序(它自己是可比較的),則使用 Comparable,而若是須要根據業務來對不一樣屬性進行排序,請使用 Comparator設計

關注公衆號:Felordcn 獲取更多資訊3d

我的博客:https://felord.cncode

相關文章
相關標籤/搜索