Java 람다 표현식 활용법

람다 표현식 기본 문법

람다 표현식은 함수형 인터페이스를 구현할 때 사용되는 간결한 문법입니다. 두 문자열의 길이 차이를 계산하는 예시를 통해 다양한 형태를 살펴보겠습니다.

문자열 first와 second의 길이 차이를 구하는 표현식은 다음과 같은 형태로 작성할 수 있습니다:

  1. 전체 타입 명시: (String first, String second) -> {return first.length() - second.length();}
  2. 타입 추론 적용: (first, second) -> {return first.length() - second.length();}
  3. 단일 표현식 축약: (first, second) -> first.length() - second.length()
  4. 단일 파라미터 생략: first -> System.out.println(first)
  5. 파라미터 없는 경우: () -> System.out.println("")

여러 반환 경로가 존재할 경우, 모든 경로는 동일한 타입을 반환해야 합니다.

함수형 인터페이스와의 연계

람다 표현식은 단일 추상 메서드를 가진 인터페이스(함수형 인터페이스)에만 적용 가능합니다. Comparator 인터페이스를 예로 들어보겠습니다:

Comparator<String> comp = (first, second) -> first.length() - second.length();

위 표현식은 다음 클래스 정의를 대체합니다:

class LengthComparator implements Comparator<String> {
    @Override
    public int compare(String s, String t1) {
        return s.length() - t1.length();
    }
}

함수형 인터페이스 타입 매칭

람다 표현식을 변수에 할당할 때는 적절한 함수형 인터페이스 타입을 지정해야 합니다. 두 개의 문자열 파라미터와 정수 반환값을 가지는 표현식은 BiFunction으로 표현됩니다:

BiFunction func = (first, second) -> first.length() - second.length();
System.out.println("결과값: " + func.apply("test", "example"));

메서드 참조 기법

람다 표현식 내부에서 단일 메서드 호출만 수행하는 경우, 메서드 참조로 더 간결하게 표현할 수 있습니다:

// 람다 표현식
Timer timer = new Timer(1000, event -> System.out.println(event));

// 메서드 참조로 변경
Timer timer = new Timer(1000, System.out::println);

메서드 참조는 세 가지 형식으로 변환됩니다:

  1. 인스턴스::메서드: System.out::printlnx -> System.out.println(x)
  2. 클래스::인스턴스메서드: String::compareToIgnoreCase(x, y) -> x.compareToIgnoreCase(y)
  3. 클래스::정적메서드: Math::pow(x, y) -> Math.pow(x, y)

변수 스코프 규칙

람다 표현식 내에서는 외부 변수를 캡처할 수 있지만, 해당 변수는 효과적으로 final이어야 합니다:

String message = "hello";
Runnable task = () -> System.out.println(message); // 정상 컴파일

// 아래 코드는 컴파일 에러 발생
Runnable task2 = () -> {
    message = "world"; // 수정 불가
    System.out.println(message);
};

외부에서 변수 값을 변경하려는 시도도 컴파일 오류를 발생시킵니다:

String message = "initial";
Runnable task = () -> System.out.println(message);

message = "changed"; // 컴파일 오류

태그: java lambda Functional Programming Method Reference comparator

8월 25일 07:05에 게시됨