Item 43 : 람다보다는 메소드 참조를 사용하라
2021. 8. 11. 14:54
람다의 장점은 간결함인데 메소드 참조를 이용하면 더 간결하게 만들 수 있다.
다음 코드는 임의의 키와 Integer값의 매핑을 관리하는 프로그램의 일부다.
map.merge(key, 1, (count, incr) -> count + incr);
이 코드는 키가 맵안에 없다면 키와 숫자 1을 매핑하고 이미 있다면 기존 매핑값을 증가시킨다.
merger메소드는 키, 값, 함수를 인수로 받으며, 주어진 키가 맵안에 아직 없다면 주어진 {키, 값} 쌍을 그대로 저장한다.
반대로 키가 이미 있다면 함수를 현재 값과 주어진 값에 적용한 다음, 그 결과로 현재 값을 덮어쓴다.
깔끔해 보이지만 매개변수 count와 incr부분이 차지하는 부분이 좀 까다로운데
정적 메소드 sum을 사용하면 다음과 같이 바꿀 수 있다.
map.merge(key, 1, Integer::sum)
하지만 람다를 메소드 참조로 바꾸는 것이 항상 정답은 아니다
예를 들어 다음 코드가 GoshThisClassNameIsHumongous 클래스 안에 잇다고 해보자
service.execute(GoshThisClassNameIsHumongous::action); //메소드 참조
service.execute(() -> action); // 람다
메소드 참조 쪽은 더 짧지도 더 명확하지도 않다. 따라서 람다 쪽이 낫다.
메소드 참조의 유형은 다섯 가지다.
메소드 참조 유형 | 예 | 같은 기능을 하는 람다 |
---|---|---|
정적 | Integer::parseInt | str -> Integer.parseInt(str) |
한정적 | Instant.now()::isAfter | Instant then = Instant.now(); t -> then.isAfter(t) |
비한정적(인스턴스) | String::toLowerClass | str -> str.toLowerClass() |
클래스 생성자 | TreeMap<K,V>::new | () -> new TreeMap<K,V>() |
배열 생성자 | int[]::new | len -> new int[len] |
정리
메소드 참조는 람다의 간단 명료한 대안이 될 수 있다. 메소드 참조 쪽이 짧고 명확하다면 메소드 참조를 쓰고 그렇지 않을때만 람다를 사용해라
'책 > 이펙티브자바' 카테고리의 다른 글
Item 45 : 스트림은 주의해서 사용하라 (0) | 2021.08.13 |
---|---|
Item 44 : 표준 함수형 인터페이스를 사용하라 (0) | 2021.08.12 |
Item 42 : 익명 클래스보다는 람다를 사용하라 (0) | 2021.08.10 |
Item 41 : 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2021.08.09 |
Item 40 : @Override 어노테이션을 일관되게 사용하라 (0) | 2021.08.09 |