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