小编Ric*_*ich的帖子

Java 8和方法引用 - 特别是compareToIgnoreCase

我阅读了有关Lambda表达式的Java 8教程,并且不太了解"引用特定类型的任意对象的实例方法"的方法参考示例

在同一个教程中,有一个示例"引用特定对象的实例方法"看起来很喜欢.

public int compareByName(Person a, Person b) {
        return a.getName().compareTo(b.getName());
}
Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
Run Code Online (Sandbox Code Playgroud)

我可以看到这个有效,因为方法compareByName与Comparator.compare具有相同的签名,lambda(a,b) - > myComparisonProvider.compareByName(a,b)接受两个参数并调用具有相同两个参数的方法.

现在,"引用特定类型的任意对象的实例方法"示例使用String :: compareToIgnoreCase

String[] stringArray = { "Barbara", "James", "Mary", "John",
    "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

该方法的签名int compareTo(String anotherString)与Comparator.compare不同.教程不是很清楚,但似乎暗示你最终得到一个lambda,如(a,b) - > a.compareToIgnoreCase(b)我不明白编译器如何决定Arrays.sort的第二个参数可以接受什么想也许它足够聪明,可以理解如何调用该方法,所以我创建了一个例子.

public class LambdaTest {

    public static void main(String... args) {
        String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };

        Arrays.sort(stringArray, String::compareToIgnoreCase);      // This works

        // using Static methods
        Arrays.sort(stringArray, FakeString::compare);              // …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

10
推荐指数
2
解决办法
1119
查看次数

标签 统计

java ×1

java-8 ×1

lambda ×1