2015-01-25 1 views
0

은 적은 코드를 작성해야 사실에도 불구하고Java 8 - 메소드 참조를 제공 한 이유는 무엇입니까?

names.stream().forEach(n -> System.out.println(n)); 

보다

names.stream().forEach(System.out::println); 

를 호출 더 나은 무엇입니까? Java 8에서 메소드 참조를 도입 할 때 다른 이점이 있습니까?

+3

사실 적은 코드를 작성해야하지만 람다의 장점은 무엇입니까? –

+1

메소드 참조가 실제로 * more * 코드 (예 :'MyClassWithLongName :: aStaticMethod')를 의미하는 많은 예제가 있음에 유의하십시오. 메소드 참조는 무언가 잘못 될 가능성이 적기 때문에 여전히 이점이 될 수 있습니다. –

+4

메소드 참조의 동기는 간단합니다 (많은 사람들이 생각하는 것처럼 "짧습니다"와 거의 관련이 없습니다). 메소드는 _names_를 가지고 있으며, 이름으로 무언가를 언급하는 것이 대체 방법보다 더 명확합니다. –

답변

4

코드가 적지 만 사실입니까? Java 8에서 메소드 참조를 도입 할 때 다른 이점이 있습니까?

적은 코드로 작성하면 언어 기능을 도입하는 데 충분한 이점이 있습니다. C#에는 method groups이라는 유사한 기능이있어 대리자를 사용하는 코드를 쉽게 작성할 수 있습니다. Lambda는 익명 클래스의 속기이며 익명 클래스는 명명 된 클래스의 속기로 간주 될 수 있습니다. 하나는 합법적으로 "통사론 설탕"이라고 할 수 있지만,이 모든 기능은 코드를 적게 작성하는 데 도움이됩니다.

코드를 단축 할 수있을뿐 아니라이 기능을 사용하면 Java 컴파일러가보다 효율적인 코드를 생성 할 수 있습니다. 예를 들어, 메소드 참조를 래핑하는 각 람다마다 아주 새로운 유형을 생성하는 것을 피할 수 있습니다.

+4

추가 이점 : 메소드 참조는 "point-free"프로그래밍 스타일의 느낌을 제공합니다. 명명 된 매개 변수는 단지 더 많은 문자가 아니며, 각 참조 취소 단계까지 신중하게 따라야한다는 점에서인지 적로드가 발생합니다. 또한 버그에 대한 문을 열어줍니다 (관련이없는 유사한 이름의 변수는 본문에서 역 참조 될 수 있음). 메서드 참조는 람다가 클로저가 아니라는 명확한 신호입니다. –

+0

즉,'(a, b, c, d) -> a.foo (b, d, c)'와 같은 표현식을 보게되면'MyClass :: foo' (그렇지 않으면 * 동급이 아닌 것을 놓칠 수도 있습니다.). 그리고 메소드 참조는 동시에 모든 매개 변수 유형을 선언 할 필요없이 대상의 선언 클래스를 나타냅니다. – Holger

0

더 적은 코드를 작성하는 것 이상의 이점은 첫 번째 예가 매개 변수를 인식 할 필요가 없다는 것입니다. 해당 기능 인터페이스의 구현이 동일한 서명 (-> 올바른 경우)이면 코드가 컴파일됩니다.

기능적 인터페이스의 서명이 변경되고 구현의 서명이 유사하게 변경되는 경우 이러한 변경 사항은 해당 접착제 코드가 아닌 해당 적용에만 적용하면됩니다.

관련 문제