이펙티브 자바, 쉽게 정리하기 - item 43. 람다보다는 메서드 참조를 사용하라
메서드 참조 사용 예
메서드 참조 사용 전
@Test
public void mapMergeTest() {
Map<String, Integer> scoreMap = new HashMap<>();
String[] names = {"John", "Jake", "Jack", "Ted", "Paul"};
scoreMap.put("Jake", 10);
for (String name : names) {
scoreMap.merge(name, 5, (o, n) -> o + n); // (*) 여기
}
for (String name : scoreMap.keySet()) {
System.out.println("name = " + name);
System.out.println("score = " + scoreMap.get(name));
}
}
scoreMap.merge()
의 3번째 인자는BiFunction
이라는 자바의 기본 함수형 인터페이스를 받는다. 위는 메서드 참조를 사용 안하고 그냥 람다만 사용하여 코드를 작성했다.
메서드 참조 사용 후
@Test
public void mapMergeTest() {
Map<String, Integer> scoreMap = new HashMap<>();
String[] names = {"John", "Jake", "Jack", "Ted", "Paul"};
scoreMap.put("Jake", 10);
for (String name : names) {
scoreMap.merge(name, 5, Integer::sum); // (*) 메서드 참조 적용
}
for (String name : scoreMap.keySet()) {
System.out.println("name = " + name);
System.out.println("score = " + scoreMap.get(name));
}
}
scoreMap.merge(name, 5, Integer::sum)
와 같이 메서드 참조를 적용했다. 굳이 람다표현식을 쓰지 않고 어떤 함수를 거치는지만클래스명::메서드명
과 같이 간단히 적어주는 식이다.- 이로 인해 이 코드에서 무엇을 하려는지도 훨씬 명확해졌다.
- 매개변수도 쓰지 않아, 매개변수가 많은 메서드라면 더욱 코드 추가로써 얻는 효율이 증가할 것이다.
- 그러나 때론 매개변수의 이름이 다른 프로그래머들의 가독성을 올려주기도 하므로 잘 생각해야 한다.
- 람다로 할 수 없는 일은 보통 메서드 참조로도 할 수 없다.
함정: 람다가 메서드 참조보다 복잡한 예
service.execute(GoshThisClassNameIsHumongous::action);
service.execute(() -> action());
위의 경우에는 람다가 메서드 참조보다 복잡하므로, 오히려 람다를 쓰는 게 낫다
메서드 참조의 종류
- 정적:
Integer::parseInt
equalsstr -> Integer.parseInt(str)
- 한정적 (인스턴스):
Instant.now()::isAfter
equalsInstant then = Instant.now(); t -> then.isAfter(t)
- 비한정적 (인스턴스):
String::toLowerCase
equalsstr.toLowerCase()
- 클래스 생성자:
TreeMap<K, V>::new
equals() -> new TreeMap<K, V>()
- 배열 생성자:
int[]::new
equalslen -> new int[len]
핵심 정리
- 메서드 참조로 코드를 작성하는 편이 짧고 명확하다면 메서드 참조를 쓰고, 아니라면 람다를 쓰자
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 44. 표준 함수형 인터페이스를 사용하라 (0) | 2023.03.29 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 45. 스트림은 주의해서 사용하라 (0) | 2023.03.29 |
이펙티브 자바, 쉽게 정리하기 - item 42. 익명 클래스보다는 람다를 사용하라 (0) | 2022.06.13 |
이펙티브 자바, 쉽게 정리하기 - item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2022.05.24 |
이펙티브 자바, 쉽게 정리하기 - item 40. @Override 애너테이션을 일관되게 사용하라 (0) | 2022.05.24 |