【问题标题】:What's the difference between instance method reference types in Java 8?Java 8 中的实例方法引用类型有什么区别?
【发布时间】:2014-03-19 19:34:05
【问题描述】:

所以 Java 8 引入了方法引用和 docs describe the four types

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

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

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

【问题讨论】:

标签: java java-8 method-reference


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

  2. String::length 将采用 String 并返回 int。它本质上翻译为string -> string.length()

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

【讨论】:

  • 最后一点,是的,String::charAt 等同于(s, i) -> s.charAt(i)。第一个 arg 成为接收器,随后的 args 向左移动一个位置。相当微妙。
  • 其实用lambda表达式比较清楚,不知道为什么要用方法引用...
【解决方案2】:

这意味着您拥有以下条件:

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

2) 例如可以是String::toUpperCase,这一般会返回StringtoUpperCase方法。

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

【讨论】:

    【解决方案3】:

    我写了结论I came to here,以下是总结。

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

    他们应该写的是:

    我发现他们对前两个的描述令人困惑(“引用静态方法”和“引用特定对象的实例方法”),我认为这确实是 class static 和一个对象

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

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

    总结

    这两种实例方法引用的区别很有趣,但基本上是学术性的。有时,你需要传入一些东西,有时,lambda 的使用会为你提供它。我的抱怨是 Oracle 的文档。他们很重视这种区别,但未能以易于理解的方式对其进行描述。这是规范的参考资料,但很容易混淆。

    wrote up 有一两个更微妙的地方。

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2014-12-28
      • 2012-10-21
      • 2012-06-23
      相关资源
      最近更新 更多