2013-11-25 83 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)存在! :-) –