람다
인자 리스트
- 인자가 없을 때: ()
- 인자가 한 개일 떄: (one) 또는 one
- 인자가 여러개 일 때: (one, two)
- 인자의 타입은 생략 가능, 컴파일러가 추론하지만 명시할 수도 있다. -> 타입이 변수 선언부에 이미 정의되어 있기 때문에
example: (Integer one, Integer two)
바디
- 화살표 오른족에 함수 본문을 정의한다.
- 여러 줄인 경우에 {}를 사용해서 묶는다.
- 한 줄인 경우에 {} 생략 가능, return도 생략 가능
변수 캡처(Variable Capture)
public class VariableCaptureExample{
public static void main(String[] args){
VariableCaptureExample variableCaptureExample = new VariableCaptureExample();
variableCaptureExample.run();
}
private void run(){
final int baseNumber = 10;
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(10);
}
}
- 로컬 변수 캡처
- final이거나 effective final인 경우에만 참조할 수 있다.
- 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일러가 방지한다.
- effective final -> 사실상 final이다. 변수 선언 이후 변수 값을 변경하지 않는 경우
- 이것도 역시 자바 8부터 지원하는 기능으로 "사실상" final 변수
- final 키워드를 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.
- 익명 클래스 구현체와 달리 "쉐도윙"하지 않는다.
- 익명 클래스는 새로 스콥을 만들지만, 람다는 람다를 감싸고 있는 스콥과 같다.
