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

Local variables in Lambdas vs Anonymous inner classes

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

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

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

};

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

O/P

3
4

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

Human h = () -> {

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

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

}

O/P

3
3

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

您的 lambda 或多或少等同于:

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

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