Comparable
public interface Comparable<T>{
int compareTo(T other);
}
这是一个函数式接口,用于比较和排序,jdk提供了一些工具类对一组对象进行排序,前提是这些对象所属类必须实现了Comparable
接口的compareTo()
方法,例如:
Arrays.sort(Object[] a); ///要求a中的元素的实际类型必须是Comparable接口的实现类;
static <T extends Comparable<? super T>> Collections.sort(List<T> list) // 要求类型T必须是Comparable接口的实现类
JDK的八大基本类型的封装类都实现了Comparable接口。
Comparator
Core Java 6.3.8
Comparator提供了许多静态方法和默认方法,为大数据的比较和排序提供了支持。
对于静态方法,调用格式是:Comparator.<T>method()
如获取String类的比较器:Comparator.<String>naturalOrder();
如果做了静态导入,类型又能推导出来,则直接方法名即可
import static java.util.Comparator.*;
...
Arrays.sort(strings, naturalOrder());
Comparator中的API
static <T> Comparator<T> nullsFirst(); // null小于所有值
static <T> Comparator<T> nullsLast(); //null值大于所有值
static <T extends Comparable<? super T>> Comparator<T> naturalOrder(); // 如果某类型实现了Comparable接口,那么此方法能调用类型的comapareTo()方法去构造出一个Comparator
default Comparator<T> reversed(); // 一个反序的比较器
static <T extends Comparable<? super T>> Comparator<T> reverseOrder(); // 构造一个与类型T的compareTo()方法的排序相反的比较器
default Comparator<T> comparaing( Funcation<T,R> keyExtractor ); //构造一个比较器,参数 keyExtractor 是一个函数式接口,用来确定根据类型T的哪个域做比较,
comparing
static <T,U extends Comparable<? super U>> Comparator<T> comparing( Funcation<? super T,? extends U> keyExtractor );
创建出一个比较器,参数 keyExtractor 是一个函数式接口,用来确定根据类型T的哪个域排序,要求域的类型U必须实现了Comparable接口。
例如:根据Person类型的name字段对一个Person[]数组排序
Arrays.sort(people,
Comparator.<Person,String>comparing(
(Person person)->{return person.getName();}
)
);
// 以上代码可以简写如下:
import static java.util.Comparator.*;
...
Arrays.sort(people,comparing(Person::getName));
static <T,U> Comparator<T> comparing( Funcation<? super T,? extends U> keyExtractor , Comparator<? super U> keyComparator);
创建出一个比较器,参数 keyExtractor 是一个函数式接口,用来确定根据类型T的哪个域排序;参数keyComparator是一个类型U的比较器。
其变体有:
comparingInt(ToIntFunction<? super T> keyExtractor); //keyExtracotr的返回的域类型必须是Int
// 还有comparingLong / comparingDouble
thenComparing
例如:对于类Student,先按照name排序,如果name相同,则再按照age排序。
Arrays.sort(students,
comparing(Student::getName).thenComparingInt(Student::getAge))
排序中遇到null时的处理
nullsFirst(Comparator<? super T> comparator)
例如,按照name对Student排序,如果遇到name为null的,全都排在最前
Arrays.sort(students, nullsFirst(comparing(Student::getName));
还有nullsLast
版权声明:本文为wenxindiaolong061原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。