Lambdas与Anonymous内部类中的局部变量



在浏览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

而对于lambdas,我得到的是:

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。

最新更新