람다의 가장 큰 특징은 간결함이다. 하지만 이런 함수 객체를 람다보다 더 간결하게 만드는 방법이 있다.
메서드 참조
자바 Map에 있는 merge 메서드를 람다식으로 사용하면 다음과 같다.
map.merge(key, 1, (count, incr) -> count + incr);
매개변수인 count와 incr는 크게 하는 일 없이 공간을 꽤 차지한다. 이 람다는 두 인수의 합을 단순히 반환할 뿐이다.
자바 8이 되면서 Integer 클래스는 이 람다와 기능이 같은 정적 메서드 sum을 제공하기 시작했다.
map.merge(key, 1, Integer::sum);
하지만 때로는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 되기도 한다. 이런 람다는 길이는 더 길지만 메서드 참조보다 읽기 쉽고 유지보수도 쉬울 수 있기 때문에 알맞은 상황에 잘 사용해야 한다.
메서드 참조의 유형
- 정적 메서드를 가리키는 메서드 참조
// 메서드 참조
map.merge(key, 1, Integer::sum);
// 람다
str -> Integer.parseInt(str);
- 한정적 인스턴스 메서드 참조
-> 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.
// 메서드 참조
Instant.now()::isAfter;
// 람다
Instant then = Instant.now();
t -> then.isAfter(T);
- 비한정적 인스턴스 메서드 참조
-> 비 한정적 참조에서는 함수 객체를 적용하는 시점에 수신 객체를 알려준다.
String::toLowerCase;
str -> str.toLoswerCase();
- 클래스 생성자
TreeMap<K,V>::new
() -> new TreeMap<K, V>
- 배열 생성자
int[]::new
len -> new int[len];