map.merge(s, 1, (count, incr) -> count + incr);
map.merge(s, 1, Integer::sum);
- 더 간단하고 명료해진다.
메서드 참조유형 | 예 | 같은 기능을 하는 람다 |
---|---|---|
정적 | Integer::parseInt |
str -> Integer.parseInt(str) |
한정적(인스턴스) | Instance.now()::isAfter |
Instance then = Instant.now(); t -> then.isAfter(t) |
비한정적(인스턴스) | String::toLowerCase |
str -> str.toLowerCase() |
클래스 생성자 | TreeMap<K, V>::new |
() -> new TreeMap<K, V>() |
배열 생성자 | int[]::new |
len -> new int[len] |
가장 흔한 유형
- 수신객체를 특정하는 한정적(bound) 인스턴스 메서드 참조이다.
- 정적 참조와 비슷
- 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.
- 수신객체를 특정하지 않는 비한정적(unbound) 인스턴스 메서드.
- 함수객체를 적용하는 시점에 수신객체를 알려준다.
- 수신객체 전달용 매개변수가 매개변수 목록의 첫번째로 추가되며,그 뒤로는 참조되는 메서드 선언에 정의된 매개변수들이 따라옴.
- 주로 스트림 파이프라인에서 매핑과 필터함수에 쓰인다.
- 생성자를 가리키는 메서드 참조와 배열 생성자를 가리키는 메서드 참조.
- 생성자 참조는 팩터리 객체로 사용된다.
- 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰자.
- 그렇지 않을때만 람다를 사용하라.
- 매개변수 이름 자체가 좋은 가이드가 될 수도 (이런경우 더 읽기 쉬움)
- 참고 >
- 람다로는 불가능하나 메서드 참조로는 가능한 유일한 예는 제네릭 함수 타입 구현이다.