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

자바 8 람다 범위 지정 문제

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

는 방법 안에 두 블록을 상상해보십시오. 왜 두 번째 블록이 유효합니까?

답변

4

첫 번째 블록에서 "shadowing"원래 x 변수입니다. 새 x을 작성하여 처음으로 x에 액세스 할 수 없습니다. 제 x (이것은 범위에서 임) 이상 존재하지 않을 때 제 x이 순간에 생성되기 때문에

제 2 블록은 괜찮다.

기본적으로 : 첫 번째 경우에는 x이라는 두 개의 변수를 동시에 사용하려고합니다. 두 번째 경우에는 두 개의 변수가 서로 뒤 따르는 두 개의 변수를 만듭니다. 수명이 겹치지 않습니다.

+0

. IF 람다가 너무 투명하면 대칭이어야합니다. –

+1

그러나 스코프는 단순히 대칭이 아닙니다. 'for' 루프 또는'if' 문과 같은 구조조차도 아닙니다. –

+0

lol이므로 lambdas (if-blocks 등)는 명명 범위를 만들지 않지만 평생 범위를 만드시겠습니까? 왜? –

5

이 정상 자바 범위와 매우 유사하다 :

int i; 
{ 
    int i;  // invalid 
}   

대 다음 "범위"대칭 밤은 왜

{ 
    int i;  // valid 
} 

int i;  
+0

나는 똑같은 것을 쓸거야! – Jyro117

+0

[동시성] (http://en.wikipedia.org/wiki/Synchronicity)이 존재합니다! :-) –