43. 람다보다는 메서드 참조를 사용하라

신명철·2022년 3월 10일
0

Effective Java

목록 보기
41/80

메서드 참조

람다는 익명 클래스보다 간결하다. 그런데 람다보다 더 간결한 방법이 있으니, 바로 메서드 참조(method reference)이다.

map.merge(key, 1, (count, incr) -> count + incr); // 람다 
map.merge(key, 1, Integer::sum); // 메서드 참조

매개변수의 수가 늘어날수록 메서드 참조로 제거할 수 있는 코드의 양도 늘어난다. 하지만, 항상 메서드 참조가 더 나은 방법은 아니다. 람다는 이름 자체가 프로그래머에게 가이드가 되기도 한다. 길이는 더 길지만 메서드 참조보다 읽기 쉽고 유지보수도 쉬울 수 있다.

람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다(애매한 예외를 제외한다면). 그렇더라도 람다로 구현했을 때 코드가 너무 길다면 메서드 참조가 보통은 더 짧고 간결하기 때문에 좋은 대안이 되어준다.

람다가 더 나은 경우

IDE들은 보통 람다를 메서드 참조로 대체하라고 권고하지만 모든 경우에 항상 이득이 되는 것은 아니다. 다음 코드를 보자.

service.excute(GoshThisClassNameIsHumongous::action); // 메서드 참조
service.excute(() -> action()); // 람다

람다 식을 사용한 경우가 메서드 참조를 사용한 경우보다 명확하고 더 짧다.

메서드 참조의 유형

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

핵심 정리
메서드 참조는 람다의 간단한 대안이 될 수 있다. 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라.

profile
내 머릿속 지우개

0개의 댓글