interface MyFunction {
public abstract int max(int a, int b);
}
// 인터페이스를 구현한 익명 클래스의 객체
MyFunction f = new MyFunction() {
@Override
public int max(int a, int b) {
return a > b ? a : b;
}
}
// 위의 익명 객체를 람다식으로 대체
MyFunction f = (int a, int b) -> a > b ? a : b;
## 함수형 인터페이스가 무엇인가요?
- 람다식을 다루기 위한 인터페이스를 말한다. (위 예시의 `MyFunction`과 같은)
- 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다. (람다식과 추상 메서드가 1:1로 매칭되기 때문)
- 반면에 static 메서드와 default 메서드의 개수에는 제약이 없다.
- 람다식은 이름이 없을 뿐 분명히 객체인데도, `Object` 타입으로 형변환 할 수 없고, **오직 함수형 인터페이스로만 형변환**이 가능하다.
- 람다식 내에서 참조하는 지역변수는 final이 붙지 않았어도 상수로 간주된다.
```java
void method(int i) {
int val = 30; // final int val = 30;
i = 10; // 에러. 상수의 값을 변경할 수 없음.
MyFunction f = () -> {
System.out.println("i=" + i);
System.out.println("val=" + val);
}
}
java.util.function
일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해놓았다.
매번 함수형 인터페이스를 정의하지 않고, java.util.function 패키지를 활용하면 된다.
람다식이 무엇인가요?
// 인터페이스를 구현한 익명 클래스의 객체 MyFunction f = new MyFunction() { @Override public int max(int a, int b) { return a > b ? a : b; } }
// 위의 익명 객체를 람다식으로 대체 MyFunction f = (int a, int b) -> a > b ? a : b;
java.util.function
java.util.function
패키지를 활용하면 된다.