독서📚

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

minl741 2023. 9. 15. 19:39

람다가 익명 클래스보다 나은 가장 큰 점은 간결함!

메서드 참조

자바에는 함수 객체를 심지어 람다보다도 더 간결하게 만드는 방법

merge()

해당 메서드는 키, 값, 함수를 인수로 받음

  • 주어진 키가 맵 안에 아직 없다면 {키, 쌍} 저장
  • 반대로 키가 이미 있다면 함수를 현재 값과 주어진 값에 적용한 다음, 그 결과로 현재 값을 덮어씀
    • 즉, {키, 함수의 결과} 쌍을 저장
map.merge(key, 1, (count, incr) -> count + incr);

merge()에 메서드 참조 적용하기

map.merge(key, 1, Integer::sum);

람다와 메서드 참조

람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없지만

  • 메서드 참조를 사용하는 편이 보통은 더 짧고 간결
  • 람다로 구현했을 때 너무 길거나 복잡하다면 메서드 참조가 좋은 대안이 되어줌
  • 즉 람다로 작성할 코드를 새로운 메서드에 담은 다음 람다 대신 그 메서드 참조를 사용하는 식

람다가 나은 경우

service.execute(GoshThisClassNameIsHumongous::action);
service.execute(()->action);

메서드 참조가 더 짧지도, 명확하지도 않은 경우에서는 람다를 사용하는 것이 낫다.

메서드 참조의 유형

정적 메서드를 가르키는 유형

한정적 인스턴스 메서드를 가르키는 유형

수신 객체 즉, 참조 대상 인스턴스를 특정하는 한정적 인스턴스 메서드 참조

비한정적 정적 메서드를 가르키는 유형

수신 객체를 특정하지 않는 비한정적 메서드 참조

  • 정적 참조와 비슷
  • 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같음

클래스 or 배열 생성자 유형

생성자 참조는 팩터리 객체로 사용