24

所以 Java 8 引入了方法引用,文档描述了这四种类型

我的问题是这两种实例类型有什么区别?

  1. 引用特定对象的实例方法。
  2. 引用特定类型的任意对象的实例方法。

两者都引用参考,但有什么显着不同?是用来解决它们的类型推断不同吗?(在他们的示例中)一个是闭包而另一个是 lambda 是否重要?它与方法的参数数量有关吗?

4

3 回答 3

17
  1. myString::charAt将采用 aint并返回 a char,并且可以用于任何以这种方式工作的 lambda。它本质上翻译为index -> myString.charAt(index).

  2. String::length会接受 aString并返回一个int. 它本质上翻译为string -> string.length().

  3. String::charAt将转换为(string, index) -> string.charAt(index).

于 2014-03-19T19:38:29.927 回答
3

有了这个,他们意味着你有以下几点:

1)可以是例如this::someFunction;,这将返回someFunction当前对象的引用。

2) 可以是例如String::toUpperCase,这将返回一般的toUpperCase方法String

我不确定行为是否存在实际差异,我认为这就像您也可以在实例变量上调用静态方法一样。

于 2014-03-19T19:40:06.303 回答
0

我写了我在这里得出的结论,以下是一个总结。

Oracle 将四种方法参考描述如下。

在此处输入图像描述

他们应该写的是:

在此处输入图像描述

我发现他们对前两个的描述令人困惑(“引用静态方法”和“引用特定对象的实例方法”),我认为它确实是类 staticobject之间的区别。

我更喜欢将第一个视为提前知道的特定对象的实例方法,而将第二个视为稍后提供的任意对象的实例方法。有趣的是,这意味着第一个是闭包,第二个是 lambda。一个是绑定的,另一个是未绑定的。

关闭某事物的方法引用(闭包)和不关闭某事物的方法引用(lambda)之间的区别可能有点学术性,但至少它是一个比 Oracle 无用的描述更正式的定义。如果您对闭包和 lambda 之间的区别感兴趣,请查看这篇文章

概括

两种类型的实例方法引用之间的区别很有趣,但基本上是学术性的。有时,您需要传递一些东西,而其他时候,lambda 的使用会为您提供它。我的抱怨是 Oracle 的文档。他们很重视这种区别,但未能以易于理解的方式对其进行描述。这是规范的参考资料,但只是令人困惑。

我写的还有一两个更微妙的地方。

于 2014-03-21T10:03:54.740 回答