#43 람다보다는 메서드 참조를 사용하라
이전 장에서는 익명 클래스보다 람다를 사용하라고 했는데, 이번엔 람다보다 메서드 참조(method reference)를 사용하라고 합니다.
메서드 참조를 이용했을 때 장점에 대해 알아보겠습니다.
Map 인터페이스에서는 merge라는 메서드를 제공하고 있습니다.
default V merge(K key, V value,
BiFunction<? super V,? super V,? extends V> remappingFunction)
key 값을 받아 주어진 key가 map 안에 없다면 value 값을 [key, value] 쌍으로 저장하고,
key 값을 받아 주어진 key가 map 안에 있다면 value 값을 BiFuction#apply 메서드에 적용한 다음, [key, BiFuction#apply 메서드의 결과] 쌍으로 저장합니다.
BiFuction 인터페이스는 하나의 추상 메서드만 가지고 있기 때문에, 함수형 인터페이스입니다.
따라서 익명 클래스나 람다를 이용해서 구현할 수 있습니다.
단순히 'int oldValue + int value' 결과 값을 리턴해주는 기능만 해주기 때문에, 이와 동일한 기능을 하는 'Integer#sum' 메서드의 참조를 전달해서 구현할 수 있습니다.
람다를 썼을 때보다 코드가 더 간결해집니다.
BiFunction<Integer, Integer, Integer> 인터페이스 파라미터 타입에 'Integer::sum'이라는 람다가 들어가는 게 이상했는데,
찾아보니 'Integer:sum'는 BinaryOperator<Integer>로 변환되고, BiFunction<Integer, Integer, Integer> 인터페이스를 상속받았기 때문에, 'Integer::sum' 람다는 BiFunction<Integer, Integer, Integer> 인터페이스 타입으로 쓸 수 도 있습니다.
위 코드처럼 메서드 참조를 이용했을 때, 오히려 코드가 더 길어지고 의미도 명확하지 않은 경우도 있습니다.
이런 경우에는 람다를 이용하는 게 더 명확합니다.
메서드 참조 유형을 나눌 수 있습니다.
책에서는 이해하기 어렵게 표현되어 있는데, Java 공식 문서에 좀 더 이해하기 쉽게 나와있습니다.