// 수정 전
int max(int a, int b) {
return a > b ? a : b;
}
// 수정 후
(int a, int b) -> { return a > b ? a : b; }
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b
// 수정 전
(a) -> { a * a }
// 수정 후
a -> { a * a }
// 에러 사항
int a -> { a * a } // 타입이 있어서 에러가 뜸
a -> a * a
(a, b) -> return a > b ? a : b // Error
단 하나의 추상 메서드만 선언된 인터페이스
@FunctionalInterface
interface MyFunction {
public abstract int max(int a, int b);
}
public class Main {
public static void main(String[] args) {
MyFunction f = new MyFunction() {
public int max(int a, int b) {
return a > b ? a : b;
}
}
System.out.println( f.max(3, 5) ); // 5
}
}
함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있다.
단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환 타입이 일치해야 한다.
MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3, 5); // 실제로 람다식이 호출됨
// 수정 전
List<String> list = Arrays.asList("a", "b", "c", "d");
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
});
// 수정 후
List<String> list = Arrays.asList("a", "b", "c", "d");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
자주 사용되는 다양한 함수형 인터페이스를 제공
하나의 메서드만 호출하는 람다식은 '메서드 참조'로 간단히 할 수 있음
// 사용법 : 클래스이름::메서드이름
Integer method(String s) {
return Integer.parseInt(s);
}
Function<String, Integer> f = (String s) -> Integer.parseInt(s); // 원래 람다식
Function<String, Integer> f = Integer::parseInt; // 메서드 참조
Supplier<MyClass> s = () -> new MyClass(); // 원래 람다식
Supplier<MyClass> s = MyClass::new; // 메서드 참조
Function<Integer, MyClass> s = (i) -> new MyClass(i); // 원래 람다식
Function<Integer, MyClass> s = MyClass::new; // 메서드 참조
// 배열
Function<Integer, int[]> f = x -> new int[x]; // 원래 람다식
Function<Integer, int[]> f = int[]::new; // 메서드 참조