주로 코드를 간결하게 작성하고 함수형 프로그래밍 스타일을 지원하기 위해 도입되었다.
Java 8에서 처음 소개되었으며, 이전의 자바 버전에서는 익명 내부 클래스를 사용하여 함수형 프로그래밍을 시도해야 했던 불편함을 해결하고자 만들어졌다.
함수형 인터페이스를 구현하기 위해 만들어짐
함수형 인터페이스란?
오직 한 개의 추상 메소드만을 가지는 인터페이스
자바에서 클래스를 정의하면서 동시에 인스턴스를 생성하는 방법 중 하나다. 이 클래스는 이름이 없으며, 단 한 번만 사용되는 경우가 많다.
클래스를 따로 정의하지 않고도 인터페이스나 추상 클래스의 인스턴스를 생성할 수 있어, 특정한 상황에서 코드를 간결하게 작성할 수 있다.
ex) 숫자 리스트를 주어진 조건에 따라 필터링하고 출력
public class AnonymousInnerClassExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 익명 내부 클래스를 사용한 조건에 따른 필터링과 출력
numbers.forEach(new ConditionFilter<Integer>() {
@Override
public boolean test(Integer number) {
return number % 2 == 0;
}
});
}
interface ConditionFilter<T> {
boolean test(T object);
default void forEach(Iterable<T> elements) {
for (T element : elements) {
if (test(element)) {
System.out.println(element);
}
}
}
}
}
public class LambdaExpressionExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 람다 표현식을 사용한 조건에 따른 필터링과 출력
numbers.forEach(number -> {
if (number % 2 == 0) {
System.out.println(number);
}
});
}
}
코드의 라인수가 줄어듬
메소드로 표현된 코드에 비해 확연히 라인 수가 줄어든다.
람다식으로 바로 실행문을 전달할 수 있음
메소드로 값이나 객체를 생성하여 전달하던 예전 방식과 달리, 람다식에서는 실행문 자체를 람다식으로 전달하여 구현한다.
의도의 명확성
가독성이 높다.
람다식은 재사용이 불가능함
일회용 함수 정의가 목적이다.
불필요하게 남발하면 가독성이 떨어짐
동일 기능의 함수를 여러 번 정의하는 상황이 발생할 수 있다.
함수형 인터페이스 구현
하나의 추상 메서드만을 가진 함수형 인터페이스를 간결하게 구현하는 데 사용된다. 함수형 인터페이스는 일반적으로 함수나 동작을 표현하는 인터페이스로, 람다 표현식은 이를 간단하게 표현할 수 있다.
// java 에서 제공하는 함수형 인터페이스
// Runnable, Comparator, Callable, Predicate, Function ...
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
컬렉션의 반복 처리
람다 표현식은 컬렉션을 간편하게 반복하고 처리할 때 효과적이다. forEach 메서드와 함께 사용하면 코드가 간결해지고 가독성이 향상된다.
함수형 프로그래밍 스타일
람다 표현식은 함수형 프로그래밍 스타일을 적용하기 위한 강력한 도구이다. 함수를 인자로 전달하거나 반환하고, 람다 표현식으로 코드를 간결하게 작성할 수 있다.
병렬 프로그래밍
자바 8에서 도입된 스트림 API 와 함께 사용되어 병렬 프로그래밍을 쉽게 할 수 있다. 간단한 구문으로 병렬 처리를 활용할 수 있다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 람다 표현식을 사용하여 각 요소를 제곱하고 병렬로 처리
numbers.parallelStream().map(x -> x * x).forEach(System.out::println);
람다식은 함수형 인터페이스를 구현하기 위해 만들어졌다.
-> 이미 정의된 함수형 인터페이스의 인스턴스를 생성
람다는 절대적이거나 독보적인 문법이 아니다. 람다식의 용도는 오직 함수형 인터페이스를 구현하기 위함일 뿐이고, 람다식 외에도 함수형 인터페이스를 구현하는 방법은 얼마든지 있다. (익명 내부 클래스, 일반 클래스, 메소드 참조 등)
그 중에서 람다식이 함수형 인터페이스를 가장 간단하고 직관적으로 구현할 수 있는 방법인 것 같다.