Item43. 람다보다는 메소드 참조를 사용하라
2022-01-19 19:52:24
#Java#Effective Java 3/E
method reference
- 메소드 참조 표현식 ( method reference expression )
method reference 는 람다식에서 기존에 존재하던 하나의 정적,인스턴스 method를 호출만할 때, 불필요한 매개변수를 제거하고 람다식을 더 간결하게 사용할 수 있게 해줌
(ref - https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html)
아래는 임의의 키와 Integer값을 매핑하는 map 인데, 이때의 merge method는 키,값,함수를 매개변수로 받아서 주어진 키가 맵안에 없다면 키,값쌍을 그대로 저장하고, 키가 이미 있다면 세 번째 인수로 들어온 함수에 현재 값과 주어진 값을 적용해 키,함수의 결과쌍을 저장한다.
map.merge(key,1,(count,incr)->count+incr);
위에서 세 번째 매개변수로 함수형 인터페이스를 구현한 람다는 그저 두 인수의 합을 반환하는 역할을 하는데 Integer의 static method인 sum을 이용하면 코드의 가독성을 증가시킬 수 있다.
map.merge(key,1,Integer::sum);
또한 람다로 구현했을때, 코드가 너무 길거나 복잡한 경우에 람다의 코드를 method로 추출해서 해당 method reference를 사용하는 방식이다.
이렇게 하게 되면 method에 적합한 naming을 할 수 있게 해준다.
항상 그렇지는 않는데, 예를 들면 method가 람다와 같은 class안에 있을때는 그저 method를 호출하는게 더 간결할 수도 있다.
예를 들면 람다와 method가 간 아래와 같이 class 명을 가진 존재한다고 하면
// method reference 방식
service.execute(GoshThisClassNameIsHumongous::action);
// method 직접 호출 방식
service.execute(()->action());
람다식이 더 간결할 수도 있다.
method reference 종류
- static method를 가리키는 method reference
Integer::parseInt
- instace method를 가리키는 method reference
- 수신 객체를 제한하는 한정적 instance method reference
- 수신 객체를 제한하지 않는 비한정적 instance method reference
한정적 instance method reference는 함수 객체가 받는 인수와 참조되는 method가 받는 인수가 똑같다.
Instance.now()::isAfter
- 비한정적 instance method reference는 함수 객체를 적용하는 시점에 수신 객체를 알려준다. 주로 stream 파이프라인에서 매핑과 필터 함수에 사용된다.
String::toLowercase()
- 클래스 생성자를 가리키는 method reference
TreeMap<K,V>::new
- 배열 생성자를 가리키는 method reference
int[]::new
