什么';Java 8中实例方法引用类型之间的区别是什么?

什么';Java 8中实例方法引用类型之间的区别是什么?,java,java-8,method-reference,Java,Java 8,Method Reference,所以Java8引入了方法引用和 我的问题是这两种实例类型之间有什么区别 对特定对象的实例方法的引用 对特定类型的任意对象的实例方法的引用 两者都引用参考文献,但有什么显著不同?用于解决这些问题的类型推断是否不同?(在他们的例子中)一个是闭包,另一个是lambda,这有意义吗?这与方法上的参数数量有关吗 myString::charAt将接受一个int并返回一个char,并且可以用于以这种方式工作的任何lambda。从本质上讲,它转换为index->myString.charAt(index)

所以Java8引入了方法引用和

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

  • 对特定对象的实例方法的引用
  • 对特定类型的任意对象的实例方法的引用
  • 两者都引用参考文献,但有什么显著不同?用于解决这些问题的类型推断是否不同?(在他们的例子中)一个是闭包,另一个是lambda,这有意义吗?这与方法上的参数数量有关吗

  • myString::charAt
    将接受一个
    int
    并返回一个
    char
    ,并且可以用于以这种方式工作的任何lambda。从本质上讲,它转换为
    index->myString.charAt(index)

  • String::length
    将获取一个
    String
    并返回一个
    int
    。它本质上翻译为
    string->string.length()

  • String::charAt
    将转换为
    (字符串,索引)->String.charAt(索引)


  • 这意味着你有以下几点:

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

    2) 例如可以是
    String::toUpperCase
    ,这通常会返回
    String
    toUpperCase
    方法

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

    我总结了结论,下面是一个总结

    Oracle对四种方法引用的描述如下

    他们应该写的是:

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

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

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

    总结 这两种类型的实例方法引用之间的差异很有趣,但基本上是学术性的。有时,您需要传入一些内容,其他时候,lambda的使用将为您提供这些内容。我的不满是Oracle的文档。他们在区别上做了一件大事,但并没有用一种容易理解的方式来描述它。这是标准的参考资料,但很容易混淆


    还有一个或两个微妙之处,我要说。

    最后一点,是的,
    String::charAt
    相当于
    (s,I)->s.charAt(I)
    。第一个arg变为接收器,随后的arg向左移动一个位置。相当微妙。事实上,使用lambda表达式更清晰,我不知道为什么要使用方法引用…我写下了我得出的结论。