这个java排序是如何工作的?

cedebl8k  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(263)

下面的代码工作正常。但我不明白它是怎么工作的?你能解释一下吗?特别是签名的方法 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;
}
6bc51xsx

6bc51xsx1#

它不是lambda-它是一个方法引用( Employee::getName 零件)。 sortEmployeeByCriteria 它只是一个普通的泛型静态方法,获取一个类型为t的列表,以及一个函数,该函数获取一个t(或子类),生成一个类型为u(或子类)的东西,并返回一个类型为t的(排序)列表。
不寻常的部分可能是comparator#comparing,它创建了一个将进行比较的comparator T 通过给定的Map,即它变换 T ,在你的情况下 Employee ,至 U ,在你的情况下 String (实验结果) getName ),它知道如何进行比较,因为字符串实现了comparable。然后使用 List#sort(Comparator) . Employee::getName 基本上是一个速记,一个可以传递的方法引用,而不是创建自己的方法引用 Function 示例。

siv3szwd

siv3szwd2#

答案就在第一行 sortEmployeeByCriteria() :

Comparator<? super T> comparator = Comparator.comparing(byCriteria);

查看 Comparator.comparing() (静态方法,与 sortEmployeeByCriteria() ):
static <T,U extends Comparable<? super U>> Comparator comparing(Function<? super T,? extends U> keyExtractor) 接受一个函数,该函数从类型t中提取一个可比较的排序键,并返回一个比较器,该比较器按该排序键进行比较。
所以 <T, U extends Comparable<? super U>> 是中的类型参数 static 方法( static <T> void someMethod(U objectOfTypeU) ),它具有 Comparator.comparing() 方法。它还允许您使用(泛型)类型 T 作为返回值(即。 List<T> ).

相关问题