람다 익명함수 (anonymous method)

인터페이스는 new연산자 사용 시, 구현체가 없기 때문에 함수를 Override해야 한다.

@FunctionalInterface
public interface Lambda {
    public int sum(int x, int y);
}

Lambda lambda = new Lambda() {
    @Override
    public int sum(int x, int y){
        return x + y;
    }
}

int result = lambda.sum(10, 20);
System.out.println(result); // 30

람다 문법

(<parameter>) -> {<body>}

람다 변수 캡쳐

스코프에 있는 변수를 획득하는 것

불필요한 캡쳐 사용을 피하는 것이 좋음

캡쳐를 당하는 변수가 Effectively final이여야 한다는 필요성

void capture() {
    int answer = 42;

    Runnable printAnswer = () -> System.out.println("정답 : " + answer);

    run(printAnswer);
}

void run(Runnable runnable) {
    runnable.run();
}

capture(); // 정답 : 42

Effectively final

초기화 된 이후 값이 한 번도 변경되지 않는 것

변수를 final로 선언하면 됨

final List<String> fruitList = new ArrayList<>();

Runnable addItem = () -> wordList.add("apple");
addItem.run(); // fruitList : [apple]

익명 클래스

인터페이스를 구현체에 상속시키지 않고 new연산자를 통해 override 시켜 구현하는 것

@FunctionalInterface
public interface HelloWorld<T> {
    T sayHello(String name);
}

// 익명 클래스
HelloWorld<String> helloWorld = new HelloWorld() {
    @Override
    public String sayHello(String name){
        return "Hello " + name + " World!";
    }
};

helloWorld.sayHello("gildong");

// 람다
HelloWorld<String> helloWorld = name -> "Hello " + name + " World!";
helloWorld.sayHello("poodle");

댓글남기기