下面的代码工作正常。但我不明白它是怎么工作的?你能解释一下吗?特别是签名的方法 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条答案
按热度按时间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
示例。siv3szwd2#
答案就在第一行
sortEmployeeByCriteria()
:查看
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>
).