Lambda 中的局部变量与匿名内部类

gho*_*der -2 java lambda anonymous-class java-8

在查看 lambda 表达式时,我发现了匿名内部类和 lambda 表达式的以下行为。这背后的原因可能是什么?

Human h = new Human() {
int a = 2;
@Override
public void sing() {

System.out.println(++a);
}

};

h.sing();
h.sing();
Run Code Online (Sandbox Code Playgroud)

输出/输出

3
4
Run Code Online (Sandbox Code Playgroud)

而对于 lambda,我得到以下结果:

Human h = () -> {

int a = 2;
System.out.println(++a);
};

h.sing();
h.sing();

}
Run Code Online (Sandbox Code Playgroud)

输出/输出

3
3
Run Code Online (Sandbox Code Playgroud)

And*_*cus 6

这些并不等同。第一个函数修改其范围之外的变量,而在第二个示例中,每次调用时h.sing();,都会调用该函数的主体。这意味着,a变量每次都用值 2 进行实例化。


Joh*_*uhn 5

你的 lambda 或多或少相当于:

Human h = new Human() {
    @Override
    public void sing() {
        int a = 2;    
        System.out.println(++a);
    }
};
h.sing();
h.sing();
Run Code Online (Sandbox Code Playgroud)

无法声明具有直接可变状态的 lambda。