Comparable接口和Comparator接口的做用 : 用于给实现类规范比较(排序)的方法.java
首先看两个接口的代码:ide
Comparable接口函数
public interface Comparable<T> { public int compareTo(T o); }
Comparator接口this
@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); //其余默认方法和静态方法; //...... }
比较两个接口的代码,咱们能够看到:spa
1.Comparable的compareTo(T)方法只有1个参数,.code
2.Comparator接口的compare(T o1, T o2)方法有两个参数, 有@FunctionalInterface接口,因此有Lambda表达式的用法对象
因此,blog
Comparable只能在类内部实现比较功能,让想让实现比较功能的类自身实现Comparable接口排序
Comparator能够作成比较器类,让比较器类实现Comparator接口继承
Comparator接口为何有多个抽象方法还被标注为函数式接口?
compare(T o1, T o2)方法外的另外一个抽象方法equals(Object obj)是Object类的方法,所以全部类都有该方法,不影响Comparator做为函数式接口(瞎猜的).
*接口并不是继承自Object,只是接口定义了一套与Object彻底相同的方法(详细内容能够网上查询一下,这里暂不讨论)
让该类实现Comparable接口,并重写接口内的compareTo(T o)方法,示例以下
public Person implaments Comparable{ private int id; private String name; //......构造函数及get/set方法省略 @Override public int compareTo(Person p) { int result = this.id-p.getId(); if(result<0) return -1; if(result > 0) return 1; return 0; } }
这样,该Person类就具有了比较的功能,当要给ArrayList<Person> list排序的时候,就能够调用Collections.sort(List T)方法,来实现对集合list的排序.
答案是: 使用比较器(Comparator)
有两种使用方法:
Collections.sort(list1, new Comparator<String>() { @Override public int compare(String o1, String o2) { int a = Integer.parseInt(o1); int b = Integer.parseInt(o2); if (a>b) return 1; if (a<b) return -1; return 0; } });
list1.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { int a = Integer.parseInt(o1); int b = Integer.parseInt(o2); if (a>b) return 1; if (a<b) return -1; return 0; } )
由于Comparator接口是函数式接口,因此List的sort()方法和Collections的sort()方法,均可以用Lambda表达式的写法.
Collections.sort(list1, (a,b) -> { //......省略 return 0; }); list1.sort((a, b) -> { //......省略 return 0; });
fff