Comparable接口和Comparator接口
Comparable和Comparator接口简介
Comparable接口和Comparator接口的作用 : 用于给实现类规范比较(排序)的方法.
首先看两个接口的代码:
Comparable接口
public interface Comparable<T> { public int compareTo(T o); }
Comparator接口
@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); //其他默认方法和静态方法; //...... }
比较两个接口的代码,我们可以看到:
1.Comparable的compareTo(T)方法只有1个参数,.
2.Comparator接口的compare(T o1, T o2)方法有两个参数, 有@FunctionalInterface接口,所以有Lambda表达式的用法
所以,
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的排序.
如果类没有实现比较功能,怎么给装有该类的List集合排序?
答案是: 使用比较器(Comparator)
有两种使用方法:
一.调用Collections.sort(List T, Comparator<? super T> c)重载方法,传入list和比较器对象实现排序
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; } });
二.使用List的sort(Comparator<? super T> c)方法,传入比较器对象来排序
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