Java 为什么Arrays.sort(stringArray,String::compareToIgnoreCase)使用compareToIgnoreCase()而不是Comparator

Java 为什么Arrays.sort(stringArray,String::compareToIgnoreCase)使用compareToIgnoreCase()而不是Comparator,java,comparator,Java,Comparator,需要澄清Arrays.sort(stringArray,String::compareToIgnoreCase)是如何使用返回类型为String而非Comparator(接受两个参数)的compareTo()的 public static void main(String[] args) { String[] stringArray = { "Steve", "Rick", "Aditya", "Negan"

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

 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);
    }
}
比较器
是一个函数接口,它接受两个
字符串
参数并返回一个
int
。如果需要这种比较器,可以使用具有相同特性的λ

compareToIgnoreCase
方法具有相同的特性,其中第一个参数是调用该方法的对象,第二个参数是该方法的参数。该方法返回一个
int
(不是
字符串
)。因此,它具有
比较器的形式

由于所有这些以及功能接口的工作方式,可以向
数组提供
比较器
对象。通过使用
compareToIgnoreCase
的lambda表达式排序
,如下所示:

Arrays.sort(stringArray, (s1, s2) -> s1.compareToIgnoreCase(s2));
Java编译器提供了一种用所谓的。当通过
String::compareTo
格式传入对
compareTo
方法的引用时,编译器将构造相同的lambda(以及
Comparator
对象)。编译器将认识到,它可以对lambda/Comparator的第一个参数(称为“receiver”)调用提供的方法,并将lambda/Comparator的第二个参数作为该方法采用的单个参数传递。该方法将返回一个
int
,这是任何
比较器应该返回的。所以你可以做:

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

魔法

你读过了吗?它没有使用
compareTo
。它使用的是
比较器