반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 43. 람다보다는 메서드 참조를 사용하라
메서드 참조(method Reference)
ex 1) 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부
map.merge(key, 1, (count, incr) -> count + incr);
- 이 코드는 키가 맵 안에 없다면 키와 숫자 1을 매핑하고, 있다면 기존 매핑값을 증가시킨다.
- 값이 키의 인스턴스 개수로 해석된다면, 이 프로그램은 멀티셋을 구현한게 된다.
- merge : 키, 값, 함수를 인수로 받으며 주어진 키가 맵 안에 없다면 주어진 {키, 값} 쌍을 그대로 저장한다. 반대로, 키가 있다면 인자로 받은 함수를 현재 값과 주어진 값에 적용한 다음 그 결과로 현재 값을 덮어쓴다.
ex 2) ex1의 코드를 메서드참조로 적용
map.merge(key, 1, Integer::sum);
- 람다식을 적용한 코드보다 훨씬 간결함
메서드 참조 vs 람다
- 람다로 할 수 없는 일이라면 메서드 참조로도 거의 할 수 없다. (메서드 참조에서드는 제네릭 함수 타입 구현이 가능하다.)
- 메서드 참조를 사용하는 편이 대개 간결하므로, 람다로 구현했을 때 너무 길거나 복잡하다면 메서드 참조도 좋은 대안이다.
- 어떤 람다에서는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드도 되기 때문에, 람다는 길이가 길지만 메서드 참조보다 읽기 쉽고 유지보수도 쉬울 수 있다.
- 즉, 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않다면 람다를 사용하자.
메서드 참조 유형)
메서드 참조 유형 | 예 | 람다식 |
정적 | Integer::parseInt | str -> Integer.parseInt(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] |
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 45. 스트림은 주의해서 사용하라 (1) | 2022.11.04 |
---|---|
[Effective Java] 아이템 44. 표준 함수형 인터페이스를 사용하라 (0) | 2022.11.03 |
[Effective Java] 아이템 42. 익명 클래스보다는 람다를 사용하라 (0) | 2022.11.01 |
[Effective Java] 아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2022.10.31 |
[Effective Java] 아이템 40. @Override 애너테이션을 일관되게 사용하라 (0) | 2022.10.28 |