我正在尝试在代码中使用Java 8方法引用。有四种类型的方法引用可用。
随着Static method reference和Constructor reference我有没有问题,但Instance Method (Bound receiver)和Instance Method (UnBound receiver)真搞糊涂了。在Bound接收器中,我们使用对象引用变量来调用如下方法:
Static method reference
Constructor reference
Instance Method (Bound receiver)
Instance Method (UnBound receiver)
Bound
objectRef::Instance Method
在UnBound接收器中,我们使用类名来调用如下方法:
UnBound
ClassName::Instance Method.
我有以下问题:
Unbound
我还从Java 8语言功能书籍中找到了对它的解释Bound和Unbound接受者,但是仍然与实际概念混淆。
诸如此类的unbound接收器的概念String::length是指对象的方法,该方法 将作为lambda的参数之一提供 。例如,lambda表达式(String s) -> s.toUpperCase()可以重写为String::toUpperCase。
String::length
(String s) -> s.toUpperCase()
String::toUpperCase
但是Bounded是指当您在lambda中调用 已存在 的 外部对象 的方法时的情况。例如,lambda表达式() -> expensiveTransaction.getValue()可以重写为expensiveTransaction::getValue。
() -> expensiveTransaction.getValue()
expensiveTransaction::getValue
三种不同方法引用方式的情况
(args) -> ClassName.staticMethod(args) 可 ClassName::staticMethod
(args) -> ClassName.staticMethod(args)
ClassName::staticMethod
(arg0, rest) -> arg0.instanceMethod(rest) 可以ClassName::instanceMethod(arg0是类型ClassName)
(arg0, rest) -> arg0.instanceMethod(rest)
ClassName::instanceMethod
arg0
ClassName
(args) -> expr.instanceMethod(args) 可 expr::instanceMethod
(args) -> expr.instanceMethod(args)
expr::instanceMethod
从 Java 8 Action Book中检索到的答案