jdk8的比较与排序(Comparator & sort):Core Java

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版权协议,转载请附上原文出处链接和本声明。