为什么Arrays.sort(stringArray,String::compareToIgnoreCase)使用com



需要澄清Arrays.sort(stringArray,String::compareToIgnoreCase(是如何使用
compareTo((的,其返回类型是String,而不是接受两个参数的Comparator。

public static void main(String[] args) {
String[] stringArray = { "Steve", "Rick", "Aditya", "Negan", "Lucy", "Sansa", "Jon" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
for (String str : stringArray) {
System.out.println(str);
}
}

Comparator<String>是一个函数接口,它接受两个String参数并返回一个int。如果需要这样的比较器,则可以使用具有相同特性的lambda。

compareToIgnoreCase方法具有相同的特性,其中第一个参数是调用该方法的对象,第二个参数是该方法的参数。该方法返回一个int(而不是String(。因此它具有Comparator<String>的形式。

由于所有这些以及功能接口的工作方式,可以通过使用compareToIgnoreCase的lambda表达式向Arrays.sort提供Comparator<String>对象,如下所示:

Arrays.sort(stringArray, (s1, s2) -> s1.compareToIgnoreCase(s2));

Java编译器提供了一种用所谓的方法引用构造这种形式的lambda的简写方法。当通过形式String::compareTo传入对compareTo方法的引用时,编译器将构造相同的lambda(因此也是Comparator<String>对象(。编译器将意识到,它可以对lambda/Comparator的第一个参数(称为"receiver"(调用所提供的方法,并将lambda/Cocomparator的第二个参数作为该方法采用的单个参数传递。该方法将返回一个int,这是任何Comparator都应该返回的值。所以你可以做:

Arrays.sort(stringArray, String::compareToIgnoreCase);

魔术!

最新更新