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

How come Arrays.sort(stringArray, String::compareToIgnoreCase) is using compareToIgnoreCase() instead of Comparator

需要澄清 Arrays.sort(stringArray, String::compareToIgnoreCase) 如何使用
compareTo() 其 return 类型是 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);
    }
}

A Comparator<String> 是一个函数式接口,它接受两个 String 参数和 returns 一个 int。如果需要这样的比较器,可以使用具有相同特性的 lambda 代替。

compareToIgnoreCase方法有相同的特点,第一个参数是调用方法的对象,第二个参数是方法的参数。方法 return 是一个 int(不是 String)。所以它的形式是 Comparator<String>.

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

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

Java 编译器提供了一种 shorthand 方法来使用所谓的 Method Reference 构造这种形式的 lambda。当通过 String::compareTo 形式传入对 compareTo 方法的引用时,编译器将构造相同的 lambda(以及 Comparator<String> 对象)。编译器将意识到它可以在 lambda/Comparator 的第一个参数(称为“接收器”)上调用提供的方法,并将 lambda/Comparator 的第二个参数作为该方法采用的单个参数传递.该方法将 return 一个 int,这是任何 Comparator 应该 return 的结果。所以你可以这样做:

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

魔法!