我试图在我的代码中使用Java 8方法引用。有四种类型的方法引用可用。

  • 静态方法引用。
  • 实例方法(绑定(bind)接收器)。
  • 实例方法(UnBound接收器)。
  • 构造函数引用。

  • 使用Static method referenceConstructor reference我没有问题,但是Instance Method (Bound receiver)Instance Method (UnBound receiver)确实让我感到困惑。在Bound接收器中,我们使用对象引用变量来调用如下方法:
    objectRef::Instance Method
    

    UnBound接收器中,我们使用类名来调用类似以下的方法:
    ClassName::Instance Method.
    

    我有以下问题:
  • 实例方法需要不同类型的方法引用吗?
  • BoundUnbound接收器方法引用之间有什么区别?
  • 我们应该在哪里使用Bound接收器,我们应该在哪里使用Unbound接收器?

  • 我还从Java 8 language features books中找到了BoundUnbound接收器的解释,但是仍然与实际概念混淆。

    最佳答案

    无限接收器(例如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中检索到的答案

    09-12 12:22