람다 식 대 메서드 참조 [닫기]


114

IntelliJ는 람다 식을 메서드 참조로 대체하도록 계속 제안합니다.

둘 다 객관적인 차이가 있습니까?


4
아니, 나는 어떤 물건도 보지 않는다! 그것은 나에게 정적 호출처럼 보이는
제라드

9
물론이야! 하지만 "찾지 못해"도 ... 맛의 문제 였고, 좀 더 기술적 측면에 대해 더 걱정했습니다. 사실, 당신이 이미 똑같다고 말했듯이 그것은 나에게 좋은 대답입니다. 어쨌든 IntelliJ가 제안했듯이 일반적으로 람다보다 메서드 참조를 보는 것이 더 감사하다고 생각합니다 (하지만 저에게는 그렇지 않습니다).
Gerard

15
람다 식의 코드는 합성 메서드로 컴파일되지만 메서드 참조는없이 작동합니다 (예외 : Type[]::new. 런타임에 생성 된 익명 클래스는 동일합니다. JRE는 그들 사이에 어떤 차이도 만들지 않습니다. 따라서 메서드 참조를 사용하면 컴파일 된 코드에서 하나의 메서드를 절약 할 수 있습니다. 반면에 단계별 디버깅을 수행 할 때 그 메서드에서 멈출 수 없습니다.
Holger

6
이제 질문은 종료 될 것입니다. 결정적인 것이 없더라도 람다와 참조의 차이를 모르는 저와 같은 모든 사용자에게는 너무 나쁩니다. 왜 아무도 감히 대답하지 않았는지 궁금합니다. 그것은 나에게 정답입니다.
Gerard

3
2 년 된 닫힌 질문에 대답하는 것은 아마도 나쁜 생각 일 수 있지만 실제로 질문을 읽은 사람들에게는 이것이 오라클의 자습서 ( docs.oracle.com/javase/tutorial/java/javaOO/… )가 말합니다. 이미 이름이있는 메서드에 대한 간결하고 읽기 쉬운 람다 식입니다.
내일

답변:


187

이 기능을 언어에 추가 한 이유에 대한 몇 가지 관점을 제공하겠습니다 (모든 메서드 참조는 람다로 표현 될 수 있음).

정답없습니다 . "항상 람다 대신 메서드 참조 사용"또는 "항상 메서드 참조 대신 람다 사용"이라고 말하는 사람은 무시해야합니다.

이 질문은 정신적으로 "명명 된 클래스와 익명의 클래스를 언제 사용해야합니까?"와 매우 유사합니까? 그리고 대답은 동일합니다. 더 읽기 쉽게 찾을 때 . 확실히 하나 또는 확실히 다른 경우가 있지만 중간에 회색의 호스트가 있으며 판단을 사용해야합니다.

메서드 심판의 이론은 간단합니다 : 이름이 중요 합니다. 메서드에 이름이있는 경우 궁극적으로 돌아 서서 호출하는 명령형 코드 가방이 아닌 이름으로 참조하는 것이 더 명확하고 읽기 쉽습니다.

성능이나 캐릭터 수에 대한 논쟁은 대부분 붉은 청어이므로 무시해야합니다. 목표는 그것이하는 일을 명확하게하는 코드를 작성하는 것입니다. 매우 자주 (항상 그런 것은 아님!) 메서드 참조가이 메트릭에서 승리하므로 이러한 경우에 사용할 수 있도록 옵션으로 포함했습니다.

메서드 참조가 의도를 명확하게하는지 또는 난독 화하는지에 대한 주요 고려 사항은 표현되는 함수의 모양이 컨텍스트에서 분명한지 여부입니다. 어떤 경우에는 (예를 들어, map(Person::getLastName)문맥 상 어떤 것을 다른 것으로 매핑하는 함수가 필요하다는 것이 매우 분명하며, 이와 같은 경우 메서드 참조가 빛을 발합니다. 다른 경우에는 메서드 참조를 사용하여 독자가 어떤 종류인지 궁금해해야합니다. 이것은 람다가 더 길어도 더 읽기 쉬울 수 있다는 경고 신호입니다.

마지막으로, 우리가 발견 한 것은 대부분의 사람들이 있다는 것입니다 처음에 멀리 방법의 심판에서 조종들이 람다보다 새롭고 별난 느낌, 그래서 처음에 "덜 읽을 수"를 찾을 수 있지만, 시간이 지남에 따라, 그들은 구문에 익숙해 질 때 때문에, 일반적으로 행동을 변경하고 가능한 경우 메서드 참조에 끌립니다. 따라서 자신의 주관적인 초기 "가독성이 떨어지는"반응은 거의 확실하게 가족 성 편향의 일부 측면을 수반하며 문체 적 의견을 표현하기 전에 두 가지 모두에 익숙해 질 수있는 기회를 제공해야합니다.


25
@Gerard 감사합니다. 더 나은 답변이었을 것입니다.
Yassin Hajaj

3
"이없는, 아니오"브라이언이 말하는 것처럼 소리 @Gerard
dj18

Brian, 동일한 방법에 대해 메서드 참조와 람다를 사용하여 다른 결과를 얻습니다. 서로 바꿔서 사용할 수 있어야하지 않나요?
Michel Feinstein

@mFeinstein 모든 메서드 참조에 대해 동등한 람다가 있습니다 (사용하거나 사용하지 않을 수 있음). 질문으로 코드를 게시 하시겠습니까?
Brian Goetz

내가 원하는하지만 안드로이드 이후 나는 코드가 너무 큰 수 있습니다 두려워 LiveData, 안쪽, Fragment내가로 변환하는 것이, Eventa로 트리거되는 ViewModel... 그리고 안드로이드 다시 같은에 갈 때 다른 동작이 발생 Fragment.. . 그래서 질문을 단순화하는 데 어려움을 겪고 있습니다
Michel Feinstein

10

여러 문으로 구성된 긴 람다 식은 코드 의 가독성 을 떨어 뜨릴 수 있습니다. 이러한 경우 메서드에서 해당 문을 추출하고 참조하는 것이 더 나은 선택 일 수 있습니다.

다른 이유는 재사용 가능성 일 수 있습니다 . 몇 개의 문에 대한 람다 식을 복사하여 붙여 넣는 대신 메서드를 구성하고 코드의 다른 위치에서 호출 할 수 있습니다.


3
비교 : houses.map(House::getName)houses.map(h -> h.getName()). 람다는 두 글자가 적습니다. 유형이 명시 적이 지 않은 것은 사실이지만 모든 IDE에서 알려줄 것이며 유형이 분명 할 때 람다를 사용해야합니다. 재사용 가능성에 동의 할 수도 있지만 람다는 정확하게 작기 때문에 큰 특정 메서드를 만드는 대신 연결될 수 있습니다. 그런 의미에서 작은 방법은 크고 복잡한 방법보다 재사용이 가능하며 람다의 명확성 (그리고 어느 정도는 상세 함)으로 인해 여전히 읽기 쉽습니다.
Gerard

11
제럴드와 함께 있어요. 가독성은 실제로 코드를 옮길 때 문제가되므로 계속 읽으려면 해당 코드로 이동 한 다음 뒤로 이동해야합니다. 당신이 원하는 같은 장소에서 모든 관련 코드를 가지고. 또한 House매우 좋은 예입니다. 어때요 ThreeStoryRedBrickHouseWithBlueDoors. 저는 다중 인수 람다에 대한 메서드 참조를 선호하며 때로는 람다가 단일 메서드 호출에 관한 것임을 강조합니다. 메소드를 참조하여 잘못 적은있다 : 당신은 실수로 외부 범위 등의 변수를 참조하여 사용하는 사이트에서 인수를 잘못 입력 할 수
마르코 Topolnik

@Gerard 나는 당신의 첫 번째 진술에 동의하지 않습니다. 잘 설명 된 메서드 이름을 사용하고 많은 양의 코드를 추출하는 경우 코드를 이동하면 가독성이 향상됩니다. 난독 화 방법 이름을 사용하는 경우 동의합니다.
스텐
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.