조슈아 블로흐가 말하는 람다 사용시 주의할 점

메서드나 클래스와 달리, 람다는 이름이 없고 문서화도 못 한다. 따라서 코드 자체로 동작이 명확히 설명되지 않거나 코드 줄 수가 많아지면 람다를 쓰지 말아야 한다. 람다는 한 줄 일 때 가장 좋고 길어야 세 줄 안에 끝내는 게 좋다. 세 줄을 넘어가면 가독성이 심하게 나빠진다. 람다가 길거나 읽기 어렵다면 더 간단히 줄여보거나 람다를 쓰지 않는 쪽으로 리팩터링하길 바란다.1

람다보다 메서드 참조를 사용하는 편이 더 나은 경우도 많으니 한 가지 방법만 고집하지 말 것.

익명 클래스를 대체하는 여러가지 방법들

  • 익명 클래스를 사용하는 전통적인 방법
List<String> words = ...;

Collections.sort(words, new Comparator<String>() {
    @Override
    public int compare(String s, String t1) {
        return Integer.compare(s.length(), t1.length());
    }
});
  • Comparator를 생성하는 메서드(comparingInt)와 메서드 참조를 사용하는 방법
List<String> words = ...;
Collections.sort(words, Comparator.comparingInt(String::length));

// List의 sort를 사용하는 방법
words.sort(Comparator.comparingInt(String::length));
  • 람다를 사용하는 방법
List<String> words = ...;
Collections.sort(words, (s, t1) -> Integer.compare(s.length(), t1.length()));

메서드 참조와 같은 기능을 하는 람다 표현

다음 표는 이펙티브 자바 Item 43에서 인용한 것이다.

메서드 참조 유형 같은 기능을 하는 람다
정적 Integer::parseInt str -> Integer.parseInt(str)
한정적(인스턴스) Instant.now()::isAfter Instant then = Instant.now(); t -> then.isAfter(t)
비한정적(인스턴스) String::toLowerCase str -> str.toLowerCase()
클래스 생성자 TreeMap<K,V>::new () -> new TreeMap<K,V>()
배열 생성자 int[]::new len -> new int[len]

참고문헌

  • 이펙티브 자바 Effective Java 3/E / 조슈아 블로크 저/개앞맵시(이복연) 역 / 인사이트(insight) / 초판 2쇄 2018년 11월 21일
    • Item 42. 익명 클래스보다는 람다를 사용하라
    • Item 43. 람다보다는 메서드 참조를 사용하라

주석

  1. 이펙티브 자바. Item 42. 257쪽.