brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Feb 04. 2019

Effective Java3/E - 람다와 스트림

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

Effective Java 3/E - 람다와 스트림


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


이전 장에서는 익명 클래스보다 람다를 사용하라고 했는데, 이번엔 람다보다 메서드 참조(method reference)를 사용하라고 합니다.


메서드 참조를 이용했을 때 장점에 대해 알아보겠습니다.




#01 메서드 참조 장점


#01 Map#merge


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 인터페이스는 하나의 추상 메서드만 가지고 있기 때문에, 함수형 인터페이스입니다.

따라서 익명 클래스나 람다를 이용해서 구현할 수 있습니다.


#02 익명 클래스, 람다




단순히 'int oldValue + int value' 결과 값을 리턴해주는 기능만 해주기 때문에, 이와 동일한 기능을 하는 'Integer#sum' 메서드의 참조를 전달해서 구현할 수 있습니다.


#03 메서드 참조


람다를 썼을 때보다 코드가 더 간결해집니다.


BiFunction<Integer, Integer, Integer> 인터페이스 파라미터 타입에 'Integer::sum'이라는 람다가 들어가는 게 이상했는데,
찾아보니 'Integer:sum'는 BinaryOperator<Integer>로 변환되고, BiFunction<Integer, Integer, Integer> 인터페이스를 상속받았기 때문에, 'Integer::sum' 람다는 BiFunction<Integer, Integer, Integer> 인터페이스 타입으로 쓸 수 도 있습니다.
#04 BinaryOperator




#02 메서드 참조 단점


#05 메서드 참조 단점


위 코드처럼 메서드 참조를 이용했을 때, 오히려 코드가 더 길어지고 의미도 명확하지 않은 경우도 있습니다.

이런 경우에는 람다를 이용하는 게 더 명확합니다.




#03 메서드 참조 유형



#06 From Effective java 메서드 유형
#07 From Oracle 메서드 유형


메서드 참조 유형을 나눌 수 있습니다.

책에서는 이해하기 어렵게 표현되어 있는데, Java 공식 문서에 좀 더 이해하기 쉽게 나와있습니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari