这个Java排序如何工作?

时间:2017-09-04 16:50:04

标签: java sorting comparator

以下代码正常运行。但我无法理解它是如何工作的?你能解释一下吗?特别是sortEmployeeByCriteria的方法签名(见下文)。

我理解它会返回List<T>,但是<T, U extends Comparable<? super U>>是什么?

public static void sortIt() {
    Employee[] employees = new Employee[] {
        new Employee("John", 25, 3000.0, 9922001),
        new Employee("Ace", 22, 20000.0, 5924001),
        new Employee("Keith", 35, 4000.0, 3924401)
    };

    List<Employee> employeeList  = Arrays.asList(employees);
    List<Employee> list = sortEmployeeByCriteria(employeeList, Employee::getName);
    list.stream().forEach(System.out::println);
}

// But could you please explain the method signature how is it working
public static <T, U extends Comparable<? super U>> List<T> sortEmployeeByCriteria( List<T> list, Function<? super T, ? extends U> byCriteria) {
    Comparator<? super T> comparator = Comparator.comparing(byCriteria);
    list.sort(comparator);
    return list;
}

2 个答案:

答案 0 :(得分:3)

答案在于sortEmployeeByCriteria()

的第一行
Comparator<? super T> comparator = Comparator.comparing(byCriteria);

查看documentation of Comparator.comparing()(静态方法,与sortEmployeeByCriteria()相同):

  

static <T,U extends Comparable<? super U>> Comparator<T>   comparing(Function<? super T,? extends U> keyExtractor)

     

接受a   从类型T中提取Comparable排序键的函数   返回按该排序键进行比较的比较器。

因此<T, U extends Comparable<? super U>>static方法(static <T> void someMethod(U objectOfTypeU))中的类型参数,它具有Comparator.comparing()方法所需的某些范围。它还允许您使用(通用)类型T作为返回值(即List<T>)。

答案 1 :(得分:1)

它不是lambda - 它是方法参考(Employee::getName部分)。 sortEmployeeByCriteria只是一个普通的通用静态方法,取一个类型为T的List,一个Function取一个T(或子类)并生成U(或子类)类型的东西并返回一个(已排序) )类型T的列表。

不常见的部分可能是Comparator#comparing,它会创建一个比较器,它会按给定的映射比较T,即它会转换T,在您的情况下为Employee ,对UStringgetName的结果),它知道如何比较,因为String实现了Comparable。然后,它会使用List#sort(Comparator)实际对它们进行排序。

Employee::getName基本上是简写,method reference您可以传递,而不是创建自己的Function实例。