등장 배경
함수형 인터페이스와 람다식이 등장한 이유를 알기 위해 다음 Person 인터페이스와 이를 구현한 Student 클래스를 보자.
interface Person {
void study(String subject){}
}
class Student implement Person {
@Override
public void study(String subject) {
System.out.println(subject + " 공부");
}
}
인터페이스를 구현하는데 상당히 많은 줄을 차지한다. 이것을 해결하기 위해 자바8에서부터 람다식을 지원한다. 람다식은 코드를 간결하게 만들기 위해 등장한 만큼 추측할 수 있는 모든 정보를 제거하여 간결하게 표현한다. 위의 코드를 람다식으로 표현하면 다음과 같다.
Person student1 = (subject) -> { System.out.println(subejct + " 공부"); }
1. student1의 타입인 Person을 통해 타입의 유추가 가능하므로 람다식에서는 이를 생략한다.
2. 함수형 인터페이스에서는 메소드가 하나만 정의되어 있기 때문에 메소드명을 생략한다.
3. 매개변수와 인자의 순서를 매칭하믕로써 타입도 유추가 가능하기 때문에 이를 생략한다.
함수형 인터페이스(Functional Interface)
함수형 인터페이스는 람다식을 사용하기 위해 등장한 인터페이스로, 함수형 인터페이스에만 람다식을 사용할 수 있다.
- 추상 메소드가 하나인 인터페이스
-> 메소드가 2개 이상 정의된다면 람다식을 사용할 수 없다. (유추할 수 있는 방법이 없음 -> 람다식 사용 불가능
- @FunctionalInterface를 붙임으로써 함수형 인터페이스임을 명시적으로 알려준다.
람다 표현식 (Lambda Expressions)
1. 메서드를 하나의 식으로 표현한 것으로, 간략하고 명확한 식으로 함수를 표현할 수 있다.
RunSomething runSomething = new RunSomething() {
@Override
public void doIt() {
System.out.println("Lambda");
}
};
위의 익명 내부 클래스를 람다식으로 사용해서 간단하게 표현하면 다음과 같이 6줄의 코드를 1줄로 표현할 수 있다.
RunSomething runSomething = () -> System.out.println("Lambda");
2. 람다식 작성하기
메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통 {} 사이에 '->'를 추가한다.
반환타입 메서드이름(매개변수) { 문장들 }
(매개변수 선언) -> { 문장 }
int max(int a, int b) {
return a > b ? a : b;
}
(int a, int b) -> { return a > b ? a : b; }