在遍历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。