효과적인 자바! Lambda에 대한 메서드 참조 선호

람다의 주요 이점 중 하나는 코드의 간결함과 익명 클래스의 사용입니다. 그럼에도 불구하고 람다조차도 불필요한 상용구로 끝나는 경우가 있습니다. 이러한 경우 우리는 우리가 지난 포스트에서 사용한 것을 본 방법 참조를 종종 사용할 수 있습니다.

메소드 참조는 단순히 매개변수를 한 곳에서 다른 곳으로 전달하는 상용구를 건너뛸 수 있도록 하는 메소드에 대한 참조입니다. 매우 간단한 예를 살펴보겠습니다.

IntStream.of(1,2,3).reduce((a, b) -> Integer.sum(a, b));

이것은 단순히 IntStream 를 생성하고 모든 값을 합한 다음 합계를 반환하는 매우 간단한 코드입니다. reduce 호출의 일부로 람다를 사용합니다. 이것은 매우 장황하지 않지만 (a, b) -> 우리에게 가치를 제공하지 않습니다. 이 동일한 코드를 보고 있지만 메서드 참조가 있습니다.

IntStream.of(1,2,3).reduce(Integer::sum);

이것은 실제로 더 간단하며 수행 방법이 아니라 수행 중인 작업에 중점을 두는 것이 좋습니다. 발생하는 합계를 직접 호출하여 합계가 어떻게 달성되는지 보여주지 않습니다.

거의 모든 경우에 동등한 람다 대신 메서드 참조를 사용해야 합니다. 그 이유는 대부분 가독성을 높이기 때문입니다. 모든 비즈니스 논리를 포함하는 메서드를 작성하고 설명적인 이름을 지정하고 메서드 참조를 통해 호출할 수 있다는 점에서 이 기능을 유용하게 사용할 수도 있습니다. 코드에서 그렇지 않은 경우 대신 람다를 사용해야 합니다. 호출해야 하는 포함 클래스의 이름이 정말 길거나 매개변수 이름이 좋은 문서 역할을 할 수 있기 때문일 수 있습니다.

마지막으로 메서드 참조를 호출하는 방법은 코드의 종류에 따라 약간 변경됩니다.


참조 유형
예시
람다 등가


공전
정수::parseInt
str -> Integer.parseInt(str)

경계
Instant.now()::isAfter
Instant then = Instant.now(); t -> then.isAFter(t);

매여 있지 않은
문자열::toLowerCase
str -> str.toLowerCase()

클래스 생성자
트리맵::새로 만들기
() -> 새로운 트리맵

배열 생성자
정수[]::새로운
len -> 새로운 정수[len]


메서드 참조가 더 짧고 명확할 때(종종 그런 경우가 있음) 이를 사용하는 것은 기본적으로 이 경험 법칙으로 귀결됩니다.

좋은 웹페이지 즐겨찾기