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

相关文章
相关标签/搜索