람다의 장점은 간결함인데 메소드 참조를 이용하면 더 간결하게 만들 수 있다.

다음 코드는 임의의 키와 Integer값의 매핑을 관리하는 프로그램의 일부다.

map.merge(key, 1, (count, incr) -> count + incr);

이 코드는 키가 맵안에 없다면 키와 숫자 1을 매핑하고 이미 있다면 기존 매핑값을 증가시킨다.

merger메소드는 키, 값, 함수를 인수로 받으며, 주어진 키가 맵안에 아직 없다면 주어진 {키, 값} 쌍을 그대로 저장한다.

 

반대로 키가 이미 있다면 함수를 현재 값과 주어진 값에 적용한 다음, 그 결과로 현재 값을 덮어쓴다.

 

깔끔해 보이지만 매개변수 count와 incr부분이 차지하는 부분이 좀 까다로운데

정적 메소드 sum을 사용하면 다음과 같이 바꿀 수 있다.

map.merge(key, 1, Integer::sum)

하지만 람다를 메소드 참조로 바꾸는 것이 항상 정답은 아니다

 

 

예를 들어 다음 코드가 GoshThisClassNameIsHumongous 클래스 안에 잇다고 해보자

service.execute(GoshThisClassNameIsHumongous::action); //메소드 참조

service.execute(() -> action); // 람다

메소드 참조 쪽은 더 짧지도 더 명확하지도 않다. 따라서 람다 쪽이 낫다.

 

 

 

메소드 참조의 유형은 다섯 가지다.

메소드 참조 유형 같은 기능을 하는 람다
정적 Integer::parseInt str -> Integer.parseInt(str)
한정적 Instant.now()::isAfter Instant then = Instant.now();
t -> then.isAfter(t)
비한정적(인스턴스) String::toLowerClass str -> str.toLowerClass()
클래스 생성자 TreeMap<K,V>::new () -> new TreeMap<K,V>()
배열 생성자 int[]::new len -> new int[len]

 

 

정리

메소드 참조는 람다의 간단 명료한 대안이 될 수 있다. 메소드 참조 쪽이 짧고 명확하다면 메소드 참조를 쓰고 그렇지 않을때만 람다를 사용해라

+ Recent posts