(인자 리스트) -> {바디}
public class LambdaExample {
public static void main(String[] args) {
LambdaExample lambda = new LambdaExample();
lambda.run();
}
private void run() {
//local Variable
int baseNumber = 100;
//로컬 클래스
class LocalClass {
void printBaseNumber() {
System.out.println(baseNumber);
}
}
// 익명 클래스
Consumer<Integer> integerConsumer = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(baseNumber);
}
};
// 람다
IntConsumer printInt = (i) -> System.out.println(i + baseNumber);
printInt.accept(100);
}
}
로컬 변수 캡처
effective final
익명 클래스 구현체와 달리 쉐도윙하지 않는다.
public class Name{
private String name;
}
로컬 클래스나 익명 클래스는 외부의 지역 변수의 이름과 같은 지역변수가 내부에 생겼을 경우 내부에 있는 값으로 쉐도윙이 된다.
private void run() {
//local Variable
int baseNumber = 100;
//로컬 클래스
class LocalClass {
void printBaseNumber() {
int baseNumber = 11;
System.out.println(baseNumber);
}
}
// 익명 클래스
Consumer<Integer> integerConsumer = new Consumer<Integer>() {
@Override
public void accept(Integer baseNumber) {
System.out.println(baseNumber);
}
}
따라서 위의 코드에서 로컬 클래스의 baseNumber의 값은 11이 되고
익명 클래스의 baseNumber의 값은 accept 메소드 변수에 할당된 값이 된다.
private void run() {
//local Variable
int baseNumber = 100;
// 람다
// 불가능
IntConsumer printInt = (baseNumber) -> System.out.println(baseNumber + baseNumber);
// 가능
IntConsumer printInt = (i) -> System.out.println(i + baseNumber);
printInt.accept(100);
}
하지만 람다는 run() 함수와 같은 스콥이기 때문에 동일한 이름의 변수를 정의할 수 없다.
private void run() {
//local Variable
int baseNumber = 100;
// 람다
// 불가능
IntConsumer printInt = (baseNumber) -> System.out.println(baseNumber + baseNumber);
// 불가능
IntConsumer printInt = (i) -> System.out.println(i + baseNumber);
printInt.accept(100);
baseNumber++;
}
또한 위와 같이 지역 변수의 값이 effective final이 아닐때에도 람다에서 지역 변수를 사용할 수 없다.