Java Lambda 与方法参考 - 一个不接收调用者的本地变量

Java Lambda vs Method Reference - One does not receive the local vars of the caller

尝试从 lambda 重构为方法引用时,我意识到方法引用似乎有所不同,无法获取调用者的局部变量(词法范围?)。当使用 lambda 作为内联代码时,完全没有问题。

public class MethodRef {

  public static void main(String[] args) {
    String appender = "I am appended";

    //possible
    appender("Hello! ", former ->  {
      StringBuilder builder = new StringBuilder(former);
      builder.append(appender);
      System.out.println(builder.toString());
    });

    //not possible
    appender("Hello! ", this::theRef);
  }

  //Delegater
  public static void appender(String former, Consumer<String> consumer){
      consumer.accept(former);
  }

  //Method Ref
  public void theRef(String former){
    StringBuilder builder = new StringBuilder(former);
    builder.append(appender);
    System.out.println(builder.toString());
  }
}

我了解该方法的参数列表不会产生任何 "appender" 但没有 "hidden" 参数可用于访问 [=18 的词法变量=] 范围?

不,这不可能。

词法范围在编译时解析。该方法以通用方式编写,技术上可以从任何地方调用。因此编译器无法猜测所有潜在调用的词法范围。

如果要维护单独的方法,唯一的方法是将调用包装到包装 lambda 中,并将局部变量作为参数传递。但我认为这不是最初的目标。

不,您不能创建可以访问方法外部局部变量的常规方法。

从其定义的范围内保留局部变量副本的 lambda 的名称是 closure

我所知道的在 Java 中使用闭包的唯一其他方式是匿名内部 类.