함수/메소드를 간단한 식으로 표현하는 방법. 메소드를 람다식으로 표현하면 메소드의 이름과 반환값이 없어져서 익명함수라고도 부른다. (함수와 메소드는 근본적으로 동일한 것이지만 메소드는 클래스에 종속되는 반면 함수는 클래스에 독립적이다.)
함수형 프로그래밍에서는 함수를 변수처럼 쓸 수 있다고 한다. 이를 사용하기 위해서는 함수를 답은 인터페이스를 지정해주어야 한다.
새로운 인터페이스 만들기
새 인터페이스 안에 추상형 메소드 하나만을 선언하고, (이걸 FunctionalInterface라고 한다. 인터페이스 선언 전에 @FunctionalInterface 어노테이션을 붙이면 메소드가 두개일 때 오류를 띄워준다!) 메인부에서 이 인터페이스의 객체를 생성하면서 메소드를 오버라이딩 해주면 객체.메소드이름(매개변수)의 형식으로 사용할 수 있고, 메인부 바깥에서 메소드를 지정해준 후 메인부에서 변수를 만들어 지정해주는 식으로도 사용할 수 있다.
@FuntionalInterface
interface Func {
public abstract int add(int a, int b);
}
public static void main(String[] args) {
Func f = new Func() {
public int add(int a, int b) {
return a + b;
}
} // 람다식을 쓰지 않고 풀어서 쓴 것
Func f = (a, b) -> a + b; // 새로 생성한 Func f 객체에 람다식으로 오버라이딩.
}
람다식이 하나의 메서드만 호출하는 경우, 메서드 레퍼런스를 이용할 수 있다.
Function<String, Integer> f = s -> Integer.parseInt(s);
Function<String, Integer> f2 = Integer::parseInt;
클래스 이름을 사용하는 대신 인스턴스의 참조변수를 적어줄 수 있는 경우도 있다. 이는 이미 생성된 객체의 메서드를 람다식에서 사용하는 경우, 외부에 존재하는 인스턴스의 참조변수를 통해서 메서드 레퍼런스를 사용할 수 있다.
MyClasss obj = new MyClass();
Function<String, Boolean> f = (x) -> obj.equals(x);
Function<String, Boolean> f2 = obj::equals;