자바의 람다표현식을 통해 코드 정의를 혁신적으로 줄여주었지만 이보다 더 간략하게 줄이는 문법이 있다.
메소드 참조(Method Reference)는 말 그대로 실행하려는 메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에서 굳이 선언이 불필요한 부분을 생략하는 것을 말한다.
ex) Math 클래스의 max() 정적 메소드를 호출하는 람다식
(x, y) -> Math.max(x, y)
BUT. 함수 형태를 보면 리턴값 자체가 또다른 Math 클래스의 메소드를 호출하는 것 뿐이고, 람다 함수의 매개변수 역시 그대로 max() 메서드의 매개변수로 들어가기 때문에 코드 중복이 발생하기 때문이다.
따라서 중복되는 매개변수를 없애고, 화살표를 없애고, 클래스가 메소드를 참조하는 기호인 . 기호를 :: 기호로 변환하면 다음과 같이 표현 할 수 있게 된다.
Math::max; // (x, y) -> Math.max(x, y)
어떠한 메서드를 참조하여 실행하느냐에 메소드 참조도 종류가 나뉘게 된다.
종류 | 람다 표현식 | 메서드 참조 |
---|---|---|
정적 메서드 참조 | (x) -> ClassName.method(x) | ClassName::method |
인스턴스 메서드 참조 | (x) -> obj.method(x) | obj::method |
매개변수의 메서드 참조 | (obj, x) -> obj.method(x) | ClassName::method |
생성자 참조 | (x, y) -> new ClassName(x, y) | ClassName::new |
프로젝트에서 사용한 사용자 주소 전체 조회 부분이다.
public List<AddressResponseDto> getUserAllAddress(User user) { return addressRepository.findAllByUser(user) .stream() .map(address -> new AddressResponseDto(address)).toList(); }
의 람다표현식을 메소드 참조 형식으로 작성할 수 있다.
public List<AddressResponseDto> getUserAllAddress(User user) { return addressRepository.findAllByUser(user) .stream() .map(AddressResponseDto::new).toList(); }
출처: https://inpa.tistory.com/entry/JAVA8-☕-람다식을-더-짧게-메소드-참조Method-Reference [Inpa Dev 👨💻:티스토리]