[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) 인스턴스 메서드 참조
- 클래스 생성자를 가리키는 메서드 참조 - 팩터리 객체로 사용
- 배열 생성자를 가리키는 메서드 참조
핵심요약
메서드 참조는 람다의 간단 명료한 대안이 될수 있는데, 메소드 참조 쪽이 짧고 명확하다면 메소드 참조를 쓰고 아니면 람다를 써라.