JAVA/람다

람다식

chanhee01 2023. 8. 7. 14:33

람다식을 간단히 표현하자면 함수(메서드)를 간단히 표현한 것이다.

 

int max(int a, int b) {
    return a > b ? a : b;
}

위와 같은 메서드가 있을 때 람다식을  표현하면 아래와 같이 짧게 표현이 가능하다.

(int a, int b) -> a > b ? a : b

반환값이 있는 경우, 식이나 값만 적고 return 문을 생략할 수 있다. return을 생략할 때에는 ;를 생략한다.

(a, b) -> a > b ? a : b

또한 매개변수의 타입이 추론 가능하면 생략도 가능하다.

 

 

 

 

람다식 작성 시 주의사항

1. 매개변수가 하나인 경우, 괄호는 생략 가능 (단, 타입이 있을 때는 생략 불가)

--->   int a -> a * a는 안됨 (int a) -> a * a라 해야지 에러가 안난다.

2. 블록 안의 문장이 하나뿐 일 때, 괄호는 생략 가능 (끝에 ;도 붙이면 안됨)

--->   (int i) -> System.out.println(i) 로 표기 가능

 

 

 

 

함수형 인터페이스

람다식을 함수처럼 다루기 위해서는 함수형 인터페이스를 선언해서 사용해야 한다.

public class Main {
    public static void main(String[] args) {
        MyFunction f = new MyFunction() {
            @Override
            public int max(int a, int b) {
                return a > b ? a : b;
            }
        };
        
        int value = f.max(3, 5);
        System.out.println(value);
    }
}

@FunctionalInterface // 함수형 인터페이스는 하나의 추상 메서드만을 가져야 한다.
interface MyFunction {
    public abstract int max(int a, int b);
}

람다식을 사용하지 않았을 때에는 위와 같은 코드로 작성되는데 람다식을 사용하면 코드가 훨신 짧아지게 된다.

public class Main {
    public static void main(String[] args) {
        // 람다식을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.
        MyFunction f = (a, b) -> a > b ? a : b;
        
        int value = f.max(3, 5);
        System.out.println(value);
    }
}

@FunctionalInterface // 함수형 인터페이스는 하나의 추상 메서드만을 가져야 한다.
interface MyFunction {
    public abstract int max(int a, int b);
}

람다식을 이용해서 인터페이스를 자동으로 오버라이딩해서 인터페이스의 max라는 메서드를 사용할 수 있게 되어진다.

 

 

 

람다식은 메서드인데, 호출할 때 필요한 이름이 없다. 그렇기 때문에 함수형 인터페이스에 있는 추상메서드를 통해서 람다식을 호출할 수 있다.

 

람다식을 사용할 때에는 (a, b) -> a > b ? a : b 라고 한 번 사용하고 끝이었는데 함수형 인터페이스를 통해 f.max()라는 메서드로 계속 호출할 수 있게 되었다.

 

 

 

 

람다식 예제

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
        
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s2.compareTo(s1);
            }
        });
    }
}

위의 익명 객체를 람다식으로 교체하면 아래와 같아진다.

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");

        Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
    }
}

람다식을 사용하면 코드도 간결해지고 훨씬 이해하기 쉬워진다.