2013-11-25 52 views
2
int x = 1; 
    Consumer<Object> f = (i) -> { 
     int x = 1; // invalid 
    }; 

的Java 8拉姆达范围界定问题

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

想象一下,一个方法内的两个街区。为什么第二个块有效?

回答

4

在第一个块中您是“shadowing”原始x变量。您将无法通过创建新的x来访问第一个x

第二块是好的,这是因为第二x上的力矩产生时第x不不再存在(它是超出范围)。

基本上:在第一种情况下,您试图同时有两个变量叫做x。在第二种情况下,您会在彼此之后创建两个变量:它们的生命周期不会重叠。

+0

为什么心不是 “范围” 对称即可。如果lambda是如此透明,那么它应该是对称的 –

+1

但范围根本不是对称的。甚至没有用于'for'循环或'if'语句的构造。 –

+0

大声笑,所以lambda(就像块等)不创建命名范围,但创建一个生命周期范围?为什么? –

5

这非常类似于普通的Java范围:

int i; 
{ 
    int i;  // invalid 
}   

{ 
    int i;  // valid 
} 

int i;  
+0

我要写完全一样的东西! – Jyro117

+0

[Synchronicity](http://en.wikipedia.org/wiki/Synchronicity)存在! :-) –