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