我阅读了有关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)