Search
Duplicate

Effective Java: 43. Prefer method references to lambdas - 람다보다 method reference 를 사용하자

태그
Effective Java
Java
Lambda
method reference
람다
이펙티브 자바
공개여부
작성일자
2020/03/31
요즘 Effective Java 에 대해서 다시 학습을 하고 있습니다. 저는 신입때 2판을 읽었기 때문에 새로 추간된 내용도 궁금하고, 이제 4년차를 향해 달려가는 시점에서 Java 를 좀 더 자세히 알아두는게 좋겠다는 생각이 들어 학습하고 있습니다.

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

Effective java 에서 이야기 하는 람다는 짧고 깔끔한 코드에 대해 강조합니다.
그런데 그 깔끔하고 짧은 코드를 Method Reference 를 이용해 더 짧고 간결하게 만들 수 있다고 설명합니다.
map.merge(key, 1, (count, incr) -> count + incr);
내용을 설명하기 위해 map의 merge를 설명하자면, key 에 해당하는 value 가 없다면 put 을 하여 저장하고, 그렇지 않으면 value 를 덮어쓰기 합니다.
그런데 이 코드를 다음과 같이 리팩토링 할 수 있습니다
map.merge(key, 1, Integer::sum);
이 두 코드는 실제적으로 기능이 동일합니다.

람다는

코드가 짧아야 하고
코드가 깔끔해야 합니다.
만약 위와 같이 않은 코드가 작성되었다면, 함수를 분리하고 단계를 나눠 Lambda 를 설계해야 합니다.
그런데 method reference 보다 lambda 가 더 깔끔한 경우가 있습니다.
service.execute(GoshThisClassNameIsMumongous::action);
service.execute(() -> action());
이 두 코드는 정확히 같은 기능을 수행합니다. 이러한 케이스는 같은 class 에 있는 method 를 호출하는 경우 발생하는데, 위와 같은 상황이라면 method reference 가 아닌 lambda 를 선택하라고 합니다.
왜냐하면, method reference 가 더 짧지도, 깔끔하지도 않기 때문입니다. (어차피 기능은 동일하니)

람다의 참조 타입 (Lambda ref types)

일반적으로 lambda 는 static method 를 참조하지만, 그렇지 않은 경우가 4가지 있습니다.
둘 둘씩 나누는데 처음 두 종류는 Bound, Unbound 이며 다음은 클래스와 array constructor 입니다.
Method Ref Type
Example
Lambda Equivalent
Bound
Open
Instant.now()::isAfter
Instant then = Instant.now();t-> then.isAfter(t);
Unbound
Open
String::toLowerCase
str -> str.toLowerCase()
class constructor
Open
TreeMap<K, V)::new
() -> new TreeMap<K, V>
Array constructor
Open
int[]::new
len -> new int[len]
Bound 는 static 과 같이 parameter로 받는다.
Unbound 는 함수에 apply 한다.
class, array constructor 는 factory object 가 된다.

결론

Lambda 와 method reference 중에 더 짧고, 깔끔한 코드를 사용하자!!
TOP