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 中使用闭包的唯一其他方式是匿名内部 类.
尝试从 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 中使用闭包的唯一其他方式是匿名内部 类.