✨ 람다식
익명 객체를 람다식으로 대체 가능한 이유 →
람다식도 실제로는 익명 객체이고 익명 객체의 메서드와 람다식의 매개변수 타입과 개수, 그리고 반환값이 일치하기 때문.
람다식은 객체이기 때문에 참조변수가 필요, 그래서 필요한 게 함수형 인터페이스
함수형 인터페이스 타입을 통해 참조변수로 람다식을 참조할 수 있다.
단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야한다.
람다식을 다루기 위한 인터페이스 : 함수형 인터페이스 (functional interface)
@FunctionalInterface
interface MyFunction { // 함수형 인처페이스 myFunction을 정의
public abstract int max(int a, int b);
}
@FunctionalInterface 를 붙이지 않아도 오류가 나진 않지만 붙이면 올바르게 코드를 짜고 있는지 확인해준다.
함수형 인터페이스는 오직 하나의 추상 메서드만 정의되어야 한다.
그래야 람다식과 인터페이스가 1 : 1로 연결될 수 있기 때문.
함수와 메서드의 차이
→ 근본적으로 동일, 함수는 일반적 용어, 메서드는 객체지향개념 용어
→ 함수는 클래스에 독립적, 메서드는 클래스에 종속적
java.util.function 패키지
→ 자주 사용되는 다양한 함수형 인터페이스를 제공
함수형 인터페이스 | 메서드 | 설명 |
java.lang.Runnable | void run() | 매개변수도 없고, 반환값도 없음. |
Supplier<T> | T get() | 매개변수는 없고, 반환값만 있음. |
Consumer<T> | void accept (T t) | Supplier와 반대로 매개변수만 있고, 반환값이 없음 |
Function<T, R> | R apply (T t) | 일반적인 함수, 하나의 매개변수를 받아서 결과를 반환 |
Predicate<T> | boolean test (T t) | 조건식을 표현하는데 사용됨. 매개변수는 하나, 반환타입은 boolean |
매개변수가 2개인 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
BiConsumer<T, U> | void accept (T t, U u) | 두 개의 매개변수만 있고, 반환값이 없음 |
BiPredicate<T,U> | boolean test(T t, U u) | 조건식을 표현하는데 사용됨. 매개변수는 둘, 반환값은 boolean |
BiFunction<T, U, R> | R apply (T t, U u) | 두 개의 매개변수를 받아서 하나의 결과를 반환 |
(Bi 는 두개라는 뜻. )
3개의 매개변수가 필요하면 만들면 된다.
UnaryOperator와 BinaryOperator
함수형 인터페이스 | 메서드 | 설명 |
UnaryOperator | T apply (T t) | Function의 자손, Function과 달리 매개변수와 결과 타입이 같다. |
BinaryOperator | T apply (T t, T t) | BiFunction의 자손, BiFunction과 달리 매개변수와 결과 타입이 같다. |
매개변수 타입과 반환타입이 모두 일치,
UnaryOperator의 조상은 Function, BinaryOperator의 조상은 BiFunction