我试图在我的代码中使用Java 8方法引用。有四种类型的方法引用可用。
使用
Static method reference
和Constructor reference
我没有问题,但是Instance Method (Bound receiver)
和Instance Method (UnBound receiver)
确实让我感到困惑。在Bound
接收器中,我们使用对象引用变量来调用如下方法:objectRef::Instance Method
在
UnBound
接收器中,我们使用类名来调用类似以下的方法:ClassName::Instance Method.
我有以下问题:
Bound
和Unbound
接收器方法引用之间有什么区别? Bound
接收器,我们应该在哪里使用Unbound
接收器? 我还从Java 8 language features books中找到了
Bound
和Unbound
接收器的解释,但是仍然与实际概念混淆。 最佳答案
无限接收器(例如String::length
)的想法是您指的是
对象的方法将作为lambda的参数之一提供。例如,
lambda表达式(String s) -> s.toUpperCase()
可以重写为String::toUpperCase
。
但是Bounded是指您在
lambda到已存在的外部对象。例如,lambda表达式() -> expensiveTransaction.getValue()
可以重写为expensiveTransaction::getValue
。
三种不同方法引用方式的情况(args) -> ClassName.staticMethod(args)
可以是ClassName::staticMethod
//这是静态的(您也可以认为是UnBound)(arg0, rest) -> arg0.instanceMethod(rest)
可以是ClassName::instanceMethod
(arg0
的类型为ClassName
)//这是无界的(args) -> expr.instanceMethod(args)
可以是expr::instanceMethod
//这是绑定(bind)的
从Java 8 Action Book中检索到的答案