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