728x90
반응형
람다가 익명 클래스보다 나은 점 중 가장 큰 특징은 간결함이다.
그런데 람다보다도 더 간결하게 만드는 방법이 있으니 바로 메서드 참조(method reference)이다.
아래 코드는 키가 맵안에 없다면 키와 숫자 1을 매핑하고, 이미 있다면 기존 매핑 값을 증가시킨다.
map.merge(key, 1, (count, incr) -> count + incr);
깔끔해 보이지만, 매개변수인 count와 incr은 크게 하는일 없이 공간을 꽤 차지한다. (두 인수의 합을 단순히 반환하는 역할을 한다.)
자바8의 Integer 클래스는 이 람다와 같은 기능이 같은 정적 메서드 sum을 제공하기 시작했다. 따라서 위의 코드는 아래코드로 변경할 수 있다.
map.merge(key, 1, Integer::sum);
그렇다면 메서드 참조 유형은 무엇이 있을까?
메서드 참조 유형
- 정적메서드 참조
- 한정적(bound) 인스턴스 메서드 참조 : 수신 객체를 특정
- 비한정적(unbound) 인스턴스 메서드 참조 : 수신 객체를 특정하지 않음
- 클래스 생성자
- 배열 생성자
// 정적 (둘은 같은 역할을 한다.)
Integer::parseInt; // 메서드 참조
str -> Integer.parseIng(str); // 람다
// 한정적 (인스턴스)
Instant.now()::isAfter;
Instant 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];
어떤 상황에서는, 람다의 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 되기도 한다. 이런 람다는 길이는 더 길지만 메서드 참조보다 읽기 쉽고 유지보수도 쉬운코드가 될 수 있다.
따라서, 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용해야 한다.
728x90
반응형
'프로그래밍 노트 > Effective 시리즈' 카테고리의 다른 글
스트림은 주의해서 사용해야한다. (0) | 2020.01.06 |
---|---|
표준 함수형 인터페이스를 사용하자. (0) | 2020.01.01 |
익명 클래스보다는 람다를 사용하라. (0) | 2019.12.26 |
규칙4. 객체 생성을 막을 때는 private 생성자를 사용하라 (0) | 2018.11.29 |
규칙3. private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하라 (0) | 2018.11.26 |