BE/Java

[Effective Java] 아이템 43. 람다보다는 메서드 참조를 사용하라

멍목 2022. 11. 2. 23:00
반응형

EFFECTIVE JAVA(이펙티브 자바)

 

 

 

이 포스팅에서 작성하는 내용은 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]

 

반응형