上一文简单对 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