간단한 식과 단일 메서드를 익명클래스로 구현해야하는 경우 item 42에서 이미 람다가 효율적임을 알게 되었다. 그러나 람다함수보다 조금 더 가독성을 높일 수 있는 경우는 메서드 참조이다.
map.merge("a", 1, (oldValue, newValue) -> oldValue + newValue);
위의 예제는 Map 타입에서 merge 메서드를 실행한 경우다.
merge는 oldValue 키가 존재하지 않으면 newValue타입을 그대로 담는다.
만약 키가 존재하면 oldValue에 newValue를 포함한 람다 function을 적용한다.
해당 인터페이스는 BiFunction이다.
만약 intellij 같은 IDE를 사용한다면 다음과 같이 추천해 줄 것이다.
map.merge("a", 1, Integer::sum);
조금 더 직관적인 이해가 가능하다. 물론 위 코드도 이해가 안가는 것은 아니지만 아래코드가 좀 더 유저 친화적임을 알 수 있다.
의도치 않게 람다 코드가 3줄 이상으로 길어지는 경우가 있을 것이다. 이는 가독성이 굉장히 떨어진다. 이런 경우 메서드 참조를 활용하면 조금 더 깔끔하게 코드를 짤 수 있다.
책에서는 service.execute()와 Function.identity()를 예제로 들었다.
Function.identity() 보다는 확실히 t -> t 가 람다로 더 직관적이긴 하다.
대부분의 경우 메서드 참조가 효과적이지만 그렇다고 람다식이 꼭 메서드 참조보다 안좋은 것은 아니다. 위의 예제와 비슷하게 예를 들어보자
map.merge("a", 1, this::TimesValueAfterPlus3);
map.merge("a", 1, (oldValue, newValue) -> (oldValue + 3) * newValue);
위 부분이 코드는 깔끔하긴 하지만 복잡한 식은 오히려 아래가 더 잘 읽힌다. 취향차이긴 하지만 상황에 따라서 lambda가 오히려 가독성이 괜찮다면 굳이 메서드를 구현해서 메서드 참조를 사용하기 보다는 lambda가 효과적일 수 있다.