int x = 1;
Consumer<Object> f = (i) -> {
int x = 1; // invalid
};
VS
Consumer<Object> f = (i) -> {
int x = 1;
};
int x = 1; // valid
想象一下方法中的那两个块。为什么第二个块有效?
答案 0 :(得分:5)
这与普通的Java范围非常相似:
int i;
{
int i; // invalid
}
VS
{
int i; // valid
}
int i;
答案 1 :(得分:4)
在第一个块中,您是“shadowing”原始x
变量。您将无法通过创建新的x
来访问第一个x
。
第二个块没问题,因为第二个x
是在第一个x
不再存在的时刻创建的(超出范围)。< / p>
基本上:在第一种情况下,您尝试同时使用两个名为x
的变量。在第二种情况下,您将相互创建两个x
变量:它们的生命周期不会重叠。