람다보다는 메소드 참조를 사용하라
람다보다 더 간결하게 사용할 수 있다. 메소드 참조(Method reference)로 말이다. 매개변수 구성(수, 타입, 순서)이 같다면 람다 대신 메소드 참조를 전달하면 같은 결과를 더 보기 좋게 얻을 수 있다. 메소드 참조가 람다를 대체하는 건 아니다. 람다로 할 수 없는 일은 메소드 참조로도 할 수 없다.
단순히 메소드 참조는 람다로 구현했을 경우 길고 복잡해질 때 좋은 대안이 되어준다. 메소드 참조는 기능을 잘 드러내는 이름을 지어줄 수도 있다. 메소드 참조의 유형은 아래의 다섯 가지다.
- 정적 메소드를 가리키는 메소드 참조
- 한정적 참조 - 수신 객체(receiving object)를 특정하는 한정적 인스턴스 메소드 참조 (함수 객체가 받는 인수와 참조되는 메소드가 받는 인수가 같다.)
- 비한정적 참조 - 수신 객체를 특정하지 않는 비한정적 인스턴스 메소드 참조 (함수 객체를 적용하는 시점에 수신 객체를 알려준다.)
- 클래스 생성자
- 배열 생성자
| 유형 | 예시 | 람다 |
|---|---|---|
| 정적 | Integer::parseInt | str -> Integer.parseInt(str); |
| 한정적(인스턴스) | Instant.now()::isAfter | t -> Instant.now.isAfter(t) |
| 비한정적 | String::toLowerCase | str -> str.toLowerCase() |
| 클래스 생성자 | Object::new | () -> new Object(); |
| 배열 생성자 | Object[]::new | () -> new Object[0]; |