[아이템 43] 람다보다는 메서드 참조를 사용하라

Jimin Lim·2023년 6월 28일
0

Effective Java

목록 보기
27/38
post-thumbnail

아이템 43

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

✅ 메서드 참조

람다의 장점 중 하나는 간결함인데, 메서드 참조를 이용해 더 간결하게 만들 수 있다. '

map.merge(key, 1, (count, incr) -> count + incr);

위는 map의 merge 메서드를 사용한 코드이다. key가 맵 안에 없다면 키와 숫자 1을 매핑하고, 이미 있다면 기존 매핑 값을 증가시킨다.

map.merge(key, 1, Integer::sum);

(count, incr) -> count + incr 이 코드에서 매개변수를 생략해 또 한 번 간결하게 변경할 수 있다. Integer 클래스의 정적 클래스 sum을 이용해 메서드 참조를 전달하여 위와 같이 나타낼 수 있다.

✅ 람다 vs 메서드 참조

메서드 참조를 사용하는 편이 보통은 더 짧고 간결하며, 기능을 잘 드러내는 이름을 지어줄 수 있다. 하지만 해당 메서드가 같은 클래스 내에 있다면, 람다가 더 간결할 수도 있다.

service.execute(GoshThisClassNameIsHumongous::action);
//같은 클래스에 존재하는 경우 
service.execute(() -> action());

✅ 메서드 참조의 유형 5가지

1. 정적 메서드를 가리키는 메서드 참조 (위의 예)

2. 수신 객체를 특정하는 한정적 인스턴스 메서드 참조

함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 같은 경우

//메서드 참조
Instant.now()::isAfter
//람다
Instant them = Instant.now();
t -> then.isAfter(t)

3. 수신 객체를 특정하지 않는 비한정적 인스턴스 메서드 참조
함수 객체를 적용하는 시점에 수신 객체를 알려준다. 주로 스트림 파이프라인에서의 매핑과 필터 함수에 쓰인다.

//메서드 참조
String::toLowerCase
//람다
str -> str.toLowerCase()

4. 클래스 생성자를 가리키는 메서드 참조

//메서드 참조
TreeMap<K,V>::new
//람다
() -> new TreeMap<K,V>()

5. 배열 생성자를 가리키는 메서드 참조

//메서드 참조
int[]::new
//람다
len -> new int[len]

생성자 참조는 팩터리 객체로 사용된다.

reference

https://cotak.tistory.com/207

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

0개의 댓글