Item43. 람다보다는 메소드 참조를 사용하라

2022-01-19 19:52:24
#Java#Effective Java 3/E

method reference

아래는 임의의 키와 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 종류

  1. static method를 가리키는 method reference
Integer::parseInt
  1. instace method를 가리키는 method reference
    • 수신 객체를 제한하는 한정적 instance method reference
    • 수신 객체를 제한하지 않는 비한정적 instance method reference

한정적 instance method reference는 함수 객체가 받는 인수와 참조되는 method가 받는 인수가 똑같다.

Instance.now()::isAfter 
  • 비한정적 instance method reference는 함수 객체를 적용하는 시점에 수신 객체를 알려준다. 주로 stream 파이프라인에서 매핑과 필터 함수에 사용된다.
String::toLowercase()
  1. 클래스 생성자를 가리키는 method reference
TreeMap<K,V>::new
  1. 배열 생성자를 가리키는 method reference
int[]::new
프로필 이미지
@chani
바둑, 스타크래프트 등 고전 게임을 좋아하는 내향인 개발자입니다

댓글