Java 8:方法引用绑定接收器和非绑定接收器之间的区别

2022-09-02 19:42:06

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

  1. 静态方法引用。
  2. 实例方法(绑定接收器)。
  3. 实例方法(未绑定接收器)。
  4. 构造函数引用。

与和我没有问题,但真的让我感到困惑。在 receiver 中,我们使用 Object 引用变量来调用如下方法:Static method referenceConstructor referenceInstance Method (Bound receiver)Instance Method (UnBound receiver)Bound

objectRef::Instance Method

在接收器中,我们使用类名来调用如下方法:UnBound

ClassName::Instance Method.

我有以下问题:

  1. 实例方法需要不同类型的方法引用吗?
  2. 和接收器方法参考之间有什么区别?BoundUnbound
  3. 我们应该在哪里使用接收器,我们应该在哪里使用接收器?BoundUnbound

我还从Java 8语言功能书中找到了解释和接收器,但仍然与实际概念混淆。BoundUnbound


答案 1

unBound 接收器(例如)的想法是,您指的是将作为 lambda 参数之一提供的对象的方法。例如,lambda 表达式可以重写为 .String::length(String s) -> s.toUpperCase()String::toUpperCase

但 Bounded 是指将 lambda 中的方法调用到已存在的外部对象时的情况。例如,lambda 表达式可以重写为 .() -> expensiveTransaction.getValue()expensiveTransaction::getValue

三种不同方法参考方式的情况

(args) -> ClassName.staticMethod(args)可以是 // 这是静态的(你也可以认为是 unbound)ClassName::staticMethod

(arg0, rest) -> arg0.instanceMethod(rest)可以是 ( 是类型 ) // 这是未绑定的ClassName::instanceMethodarg0ClassName

(args) -> expr.instanceMethod(args)可以是 // 这是绑定的expr::instanceMethod

Java 8 操作手册中检索到的答案


答案 2

基本上,未绑定的接收器允许您使用实例方法,就好像它们是具有声明类型的第一个参数的静态方法一样 - 因此您可以通过传入所需的任何实例将它们用作函数。对于绑定的接收器,“目标”实例实际上是函数的一部分。

举个例子可能会更清楚地说明这一点:

import java.util.function.*;

public class Test {

    private final String name;

    public Test(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Test t1 = new Test("t1");
        Test t2 = new Test("t2");

        Supplier<String> supplier = t2::method;
        Function<Test, String> function = Test::method;

        // No need to say which instance to call it on -
        // the supplier is bound to t2            
        System.out.println(supplier.get());

        // The function is unbound, so you need to specify
        // which instance to call it on
        System.out.println(function.apply(t1));
        System.out.println(function.apply(t2));
    }

    public String method() {
        return name;
    }
}

推荐