【发布时间】:2021-11-13 12:18:26
【问题描述】:
在 Java 中,捕获的 lambda 变量的值可以在原始变量范围之外使用,如下所示:
interface MyInterface{
void doSomething( );
}
class Example {
MyInterface lambda;
public static void main(String[] args) {
Example e = new Example();
e.f1();
e.f2();
}
void f1() {
int local = 777;
lambda = () -> System.out.println(local);
}
void f2() {
lambda.doSomething(); // prints 777
}
}
匿名类也可以做到这一点。我怀疑实现会通过复制捕获本地值来做到这一点。
规范是否保证捕获的本地人能够在 lambda 中存活多久?
我希望参考文档中的相关段落。 (我找了,没找到)
【问题讨论】:
-
我现在明白了。你看过编译后的代码吗?这可能会告诉你一些事情。
-
@HovercraftFullOfEels 好的。由于我对字节码的糟糕命令,它看起来确实像是 777 的副本被加载到 f1 中返回对象的堆栈中。但这可能只是一个实现细节。我正在寻找更正式的东西。
-
"规范是否保证捕获的本地变量能够在 lambda 表达式中存活多久?" - 是的。我不知道概述它的确切 JLS 段落,但这至少部分是为什么在 lambda 中访问的变量必须是
final或实际上是final。