Java的方法引用

Java的方法引用,java,Java,根据,String::compareToIgnoreCase也是一个有效的方法引用,我的问题是,compareToIgnoreCase不是一个静态方法,换句话说,compareToIgnoreCase必须附加到特定的String实例。那么,当我使用String::compareToIgnoreCase时,JDK如何知道我引用的String的哪个实例呢?String::compareToIgnoreCase没有被使用,例如str1。compareToIgnoreCase(str2)。 它实际上被用

根据,String::compareToIgnoreCase也是一个有效的方法引用,我的问题是,
compareToIgnoreCase
不是一个静态方法,换句话说,
compareToIgnoreCase
必须附加到特定的
String
实例。那么,当我使用
String::compareToIgnoreCase
时,JDK如何知道我引用的
String
的哪个实例呢?

String::compareToIgnoreCase
没有被使用,例如
str1。compareToIgnoreCase(str2)
。 它实际上被用作比较器。 你可以把它比作

Arrays.sort(someIntegerArray, Collections.reverseOrder()) 
但在这种情况下,它将是

Arrays.sort(someStringArray, String::compareToIgnoreCase) 

考虑以下使用
toUpperCase
的示例,这也是一种实例方法

它在这种情况下工作,因为正在处理的流项与正在调用的方法的类的类型相同。因此,该项实际上直接调用该方法

所以

Stream.of("abcde").map(String::toUpperCase).forEach(System.out::println);
String::toUpperCase
调用将与
“abcde”.toUpperCase()相同

如果您这样做:

Stream.of("abcde").map(OtherClass::toUpperCase).forEach(System.out::println);
“abcde”不是
OtherClass
的一种类型,因此
OtherClass
需要如下所示,流才能工作

class OtherClass {
    public static String toUpperCase(String s) {
       return s.toUpperCase();
    }
} 

这就像有一个额外的参数,实际的实例,涉及

String::compareTignoreCase
示例:

ToIntBiFunction<String, String> func = String::compareToIgnoreCase;
int result = func.applyAsInt("ab", "cd");    // some negative number expected
length
不接受任何参数,但函数的第一个参数用作调用实例
length



上面的示例非常抽象,只是为了说明所涉及的类型。函数大多直接用于某些方法调用,调用时无需使用中间变量

,您必须提供字符串。您链接的文档页解释了这一点。请参阅“引用特定类型的任意对象的实例方法”一节。
ToIntFunction<String> f = String::length;  // function accepting String, returning int
int length = f.applyAsInt("abc");          // 3