[item43] 람다 보다는 메서드 참조(람다 축약)를 사용하라 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

람다가 익명 클래스 보다 나은 점 중에서 가장 큰 특징은 간결함

  • 임의의 키와 Integer값의 매핑을 관리하는 코드
           키   값   함수 
map.merge(key, 1, (count, incr) → count + incr);
  • 키가 맵 안에 없다면 키와 숫자 1을 매핑 하고 이미 있다면 기존 매핑 값을 증가시킨다.
  • 매개변수 count와 incr은 크게 하는 일 없이 공간을 꽤 차지한다.
  • 이 람다는 두 인수의 합을 단순히 반환할 뿐이다.

메서드 참조

메서드 참조는 특정 메소드 만을 호출하는 람다의 축약형

  • 자바에서 함수 객체를 람다 보다도 더 간결하게 만드는 방법
  • 람다로 작성할 코드를 새로운 메서드에 담은 다음, 람다 대신 그 메서드 참조를 사용 하는 식이다.
  • 자바 8이 되면서 Integer 클래스(와 모든 기본 타입의 박싱 타입)는 이 람다와 기능이 같은 정적 메서드 sum을 제공하기 시작했다.
map.merge(key, 1, Integer::sum);

람다가 메소드 참조보다 간결한 경우

주로 메서드와 람다가 같은 클래스에 있을때 그렇다.

예를들어 아래의 함수들이 GoshThisClassnameisHumongous 클래스안에 있다고 했을 때,

class GoshThisClassnameIsHumongous{
    //before
    service.execute(GoshThisClassnameIsHumongous::action);

    //after
    service.execute(() -> action());
}

메소드의 참조가 더 짧지도 명확하지도 않으므로 람다가 낫다.

메서드 참조의 유형 다섯 가지

정적 메서드를 가리키는 메서드 참조

  • java.util.function 패키지가 제공하는 제네릭 정적 팩터리 메서드인 Function.identity()를 사용하기 보다는 똑같은 기능의 람다(x → x)를 직접 사용하는 편이 코드도 짧고 명확함.

인스턴스 메서드를 참조

  • 수신 객체(receiving object; 참조 대상 인스턴스)를 특정하는 한정적(bound) 인스턴스 메서드 참조
  • 수신 객체를 특정하지 않는 비한정적(unbound) 인스턴스 메서드 참조
  • 클래스 생성자를 가리키는 메서드 참조 - 팩터리 객체로 사용
  • 배열 생성자를 가리키는 메서드 참조

핵심요약

메서드 참조는 람다의 간단 명료한 대안이 될수 있는데, 메소드 참조 쪽이 짧고 명확하다면 메소드 참조를 쓰고 아니면 람다를 써라.