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