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