Lambda Capturing

Lambda Capturing 은 람다 바디 외부에 선언된 변수를 람다 바디 내부에서 사용하는 것을 의미한다. 이때 제약조건이 있는데 변수가 final 이거나 Effective Final (사실상 final 로 간주되는 변수) 이어야 한다. 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일러가 알려준다. (Variable used in lambda expression should be final or effectively final)

int count = 1;

// 람다는 람다를 선언한 메서드의 Scope 와 람다 바디의 Scope 가 동일하다.
IntConsumer printInt = (i) -> {
    /**
     * int count = 2; 선언 불가능
     * Variable 'count' is already defined in the scope
     */
    System.out.println(count);
};