람다란
람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다.
람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다.
람다의 특징
- 익명
보통의 메서드와 달리 이름이 없으므로 익명이라 표현, 구현해야 할 코드에 대한 걱정거리가 줄어든다. - 함수
람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. - 전달
람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다 - 간결성
익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다.
커스텀 Comparator -> 람다
1. 기존 코드
Comparator<Apple> byWeight = new Comparator<Apple>() {
@Override
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
}
2. 람다
Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
위의 코드처럼 람다 표현식을 이용하면 compare 메서드의 바디를 직접 전달하는 것처럼 코드를 전달할 수 있다.
람다를 어디에 사용할 수 있는가
함수형 인터페이스에서 사용이 가능하다.
함수형 인터페이스란
함수형 인터페이스란 오직 하나의 추상 메서드만 가지는 인터페이스를 말한다.
인터페이스는 디폴트 메서드를 포함할 수 있습니다.
디폴트 메서드는 인터페이스의 메서드를 구현하지 않은 클래스를 고려해서 기본 구현을 제공하는 바디를 포함하는 메서드입니다.
그리고 디폴트 메서드가 있더라도 추상 메서드가 오직 하나면 함수형 인터페이스입니다.
사용하는 이유
함수형 인터페이스를 사용하는 이유는 자바의 람다식은 함수형 인터페이스로만 접근이 되기 때문입니다.
public static void main(String[] args) {
//람다식
FunctionalInterface fun = text -> System.out.println(text);
fun.print("나와라~");
//익명 클래스 형식
//아래 처럼 익명 클래스를 사용하지 않고 함수형 인터페이스와 람다식을 사용하면 위의 코드 처럼 좀 더 코드가 간결해진다.
FunctionalInterface func = new FunctionalInterface() {
@Override
public void print(String text) {
System.out.println(text);
}
};
func.print("나와라2~");
}
public interface FunctionalInterface {
//인터페이스에 선언된 상수와 추상 메서드는 public static final 과 public abstract 생략 가능
//이유는 컴파일 시에 자동으로 생성해주기 때문
public abstract void print(String text);
}
//실행 결과
//나와라~
//나와라2~
위의 코드처럼 매번 람다식을 사용할 때마다 함수형 인터페이스를 정의하기에는 불편하기 때문에
자바에서 라이브러리로 제공하는 기본 함수형 인터페이스가 있습니다.
기본 함수형 인터페이스
- Runnable
- Supplier
- Consumer
- Function<T,R>
- Predicate
자세하게 확인하고 싶으시면 아래에서 확인해주세요
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html