람다는 지역 변수를 사용함에 있어 몇 가지 제한이 있다.
1. 지역 변수와 같은 이름의 람다 인자를 사용하거나 람다 바디에서 사용하면 안된다.
2. 지역 변수를 재할당 해서는 안된다.
i로 이름이 같다. int i = 0;
Consumer<Integer> c1 = (i) -> {
System.out.println("Value is : " + i);
};
int i = 0;
Consumer<Integer> c1 = (i1) -> {
int i = 2;
System.out.println("Value is : " + i1);
};
int value = 4; // local variable
Consumer<Integer> c1 = (i) -> {
value += i;
System.out.println(value);
};
c1.accept(4);
public class LambdaVariable2 {
static int value = 4;
public static void main(String[] args) {
// int value = 4; // local variable
Consumer<Integer> c1 = (i) -> {
value += i;
System.out.println(value);
};
c1.accept(4);
}
}
final로 선언되지 않았지만 final인 것처럼 사용하는 것이다.final로 선언되었어야 한다.int x = 10;
x = 20; // x가 수정되었습니다.
Runnable r = () -> System.out.println(x); // 컴파일 오류
이 경우, x가 두 번 할당되었기 때문에 effectively final이 아니다. 따라서 람다 내부에서 참조할 수 없으며 컴파일 오류가 발생한다.
effectively final은 람다 표현식을 이용한 프로그래밍에서, 변수의 변경을 방지하고 코드를 더 안정적이고 예측 가능하게 만들기 위한 제약 조건이다.