Java 8 lambda范围问题

时间:2013-11-25 19:22:51

标签: java closures java-8

    int x = 1;
    Consumer<Object> f = (i) -> {
        int x = 1; // invalid
    };

VS

    Consumer<Object> f = (i) -> {
        int x = 1;
    };
    int x = 1; // valid

想象一下方法中的那两个块。为什么第二个块有效?

2 个答案:

答案 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变量:它们的生命周期不会重叠。