람다 표현식은 메서드로 전달할 수 잇는 익명 함수를 단순화한 것이라고 할 수 있다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식 발생할 수 있는 예외 리스트는 가질 수 있다.
람다가 중요한 이유는 앞에서 코드를 전달하는 과정에서 불필요한 많은 코드가 생기고, 람다로 이 문제를 해결할 수 있었다.
즉 람다를 이용하면 코드가 간결하고 유연해진다
Comparator<Apple> byWeight = new Comparator<Apple>() {
public int comparator(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
};
람다를 이용한 코드
Comparator<Apple> byWeight =
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
해당 구문이 람다 표현식이며 파라미터, 화살표, 바디로 이루어진다.
(Apple a1, Apple a2) → a1.getWeight().compareTo(a2.getWeight())
str -> {System.out.println(str)};
- 두개 이상인 경우 사용불가
(x,y) -> {System.out.println(x+y)};
str -> System.out.println(str);
str -> return str.length();
str -> str.length();
람다는 함수형 인터페이스라는 문맥에서 사용할 수 있다.
정확히 하나의 추상 메서드를 지정하는 인터페이스를 함수형 인터페이스라고 한다.
public interface Predicate<T> {
boolean test(T t);
}
public interface Comparator<T> {
int compare(T o1, T o2);
}
public interface Runable {
void run();
}
public interface ActionListener extends EventListnenr {
void actionPerformed(ActionEvent e);
}
public interface callable<V> {
V call() throws Exception;
}
public interface PrivilegedAction<T> {
T run();
}
많은 디폴트 메서드가 있더라고 추상 메서드가 오직 하나면 함수형 인터페이스다.
함수형 인터페이스를 사용하면 람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있으므로
전체 표현식을 함수형 인터페이스의 인스턴스로 취급(기술적으로 따지면 함수형 인터페이스를 구현한 클래스의 인스턴스)할 수 있다.
Runnable r1 = () -> System.out.println("Hellow world 1") // 람다 사용
Runnable r2 = new Runnable() { // 익명 클래스 사용
public void run() {
System.out.println("Hellow world 2");
}
}
public static void process(Runnable r) {
r.run();
}
process(r1);
process(r2);
process(() -> System.out.println("Hellow world 3")); // 직접 전달된 람다 표현시긍로 'Hellow world 3' 출력
함수형 인터페이스의 추상 메서드 시그니처는 람다 표현식의 시그니처를 가리킨다. 람다 표현식의 시그니처를 서술하는 메서드를 함수 스크립터 라고 부른다.
예를 들어, Runnable 인터페이스의 유일한 추상 메서드 run은 인수와 반환 값이 없으므로 (void 반환) Runnable 인터페이스는 인수와 반환값이 없는 시그니처로 생각할 수 있다.
출처
모던 자바 인 액션