gpt4 book ai didi

Java Lambda 与方法引用 - 不接收调用者的本地变量

转载 作者:行者123 更新时间:2023-12-01 21:27:03 25 4
gpt4 key购买 nike

尝试从 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());
}
}

我知道该方法的参数列表不会产生任何“附加程序”,但是是否有一个“隐藏”参数可以用来访问调用者/消费者范围的词法变量?

最佳答案

不,这是不可能的。

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

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

关于Java Lambda 与方法引用 - 不接收调用者的本地变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com