-
람다식을 간단히 표현하자면 함수(메서드)를 간단히 표현한 것이다.
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)); } }
람다식을 사용하면 코드도 간결해지고 훨씬 이해하기 쉬워진다.