Comparator的自定义实现
@FunctionalInterface
public interface Comparator<T> {
int compare(T t1, T t2);
static <T> Comparator<T> comparing(
Function<T, Comparable> f){
return (p1, p2) -> f.apply(p1).compareTo(f.apply(p2));
}
default Comparator<T> thenComparing(
Comparator<T> cmp){
return (p1, p2) ->
this.compare(p1, p2) == 0 ?
cmp.compare(p1, p2) : this.compare(p1, p2);
}
default Comparator<T> thenComparing(
Function<T, Comparable> f){
Comparator<T> cmp = comparing(f);
return thenComparing(cmp);
}
}
我创建了一个包含三个字段的Person类,即firstName,lastName和age,以及它们各自的getter和setter。使用自定义Comparator类,我想在main中对一组人员进行排序,如下所示:
Comparator<Person> cmp = Comparator
.comparing(Person::getLastName) // Extract Property and compare
.thenComparing(Person::getFirstName)
.thenComparing(Person::getAge);
Person arr[] = new Person[]{
new Person("Sean", "Gilmore", 22),
new Person("Aaron", "Reidy", 21),
new Person("Jane", "Kennedy", 53),
new Person("Mike", "English", 49)
};
Arrays.sort(arr, cmp);
但是Arrays.sort(arr, cmp);
会引发编译错误no instance of type variable T exists so that Comparator<Person> conforms to Comparator<? super T>
我被这个错误抛弃了,我想知道如何使用cmp
比较器对Person数组进行排序。
答案 0 :(得分:3)
Java 中class
的完全限定名称包含它的包名称。
Arrays.sort方法需要java.util.Comparator
实现。您的自定义Comparator
与java.util.Comparator
不一样。
sort
类中的Arrays
方法是static
方法,因此您无法扩展Arrays
并覆盖此方法。如果您要使用Arrays.sort,请使用java.util.Comparator
的实现。没有办法解决它。
答案 1 :(得分:3)
您可以轻松地将Comparator
改编为JDK,如下所示:
Arrays.sort(arr, cmp::compare);
我相信Guava建议使用类似的模式来修改它们的功能接口,然后再为Java 8进行改造。