根据Oracle文档,String::compareToIgnoreCase
也是一个有效的方法引用,我的问题是compareToIgnoreCase
不是静态方法,换句话说,compareToIgnoreCase
必须附加到特定的String
实例。那么JDK如何知道我在使用String::compareToIgnoreCase
时引用了哪个String
实例呢?
考虑以下示例,使用toUpperCase
这也是一个实例方法。
它在这种情况下有效,因为正在处理的 Stream 项与要调用的方法的类属于同一类型。 因此,该项实际上直接调用该方法。
所以对于
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::compareToIgnoreCase
不会像str1.compareToIgnoreCase(str2)
那样使用。 它实际上用作比较器。 例如,您可以将其与
Arrays.sort(someIntegerArray, Collections.reverseOrder())
但在这种情况下,这将是
Arrays.sort(someStringArray, String::compareToIgnoreCase)
这就像涉及一个额外的参数,即实际实例。
String::compareToIgnoreCase
示例:
ToIntBiFunction<String, String> func = String::compareToIgnoreCase;
int result = func.applyAsInt("ab", "cd"); // some negative number expected
我们得到一个ToIntBiFunction
- 一个返回int
的双参数函数 - 因为结果是一个int
,第一个参数对应于compareToIgnoreCase
的this
,第二个函数参数是传递给compareToIgnoreCase
的参数。
也许更容易一点:
ToIntFunction<String> f = String::length; // function accepting String, returning int
int length = f.applyAsInt("abc"); // 3
length
不接受任何参数,但函数的第一个参数用作调用length
实例
上面的例子非常抽象,只是为了展示所涉及的类型。函数大多直接用于某些方法调用,无需使用中间变量