Java 的方法参考

  • 本文关键字:参考 方法 Java java
  • 更新时间 :
  • 英文 :


根据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,第一个参数对应于compareToIgnoreCasethis,第二个函数参数是传递给compareToIgnoreCase的参数。

<小时 />

也许更容易一点:

ToIntFunction<String> f = String::length;  // function accepting String, returning int
int length = f.applyAsInt("abc");          // 3

length不接受任何参数,但函数的第一个参数用作调用length实例


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

最新更新