메소드 참조가 람다 랩퍼의 오버 헤드를 생략합니까? 그들은 미래에 있을까요?
때로는 ... 람다 식은 기존 메소드를 호출하는 것 외에는 아무것도하지 않습니다. 이 경우 기존 방법을 이름으로 참조하는 것이 더 명확합니다. 메소드 참조를 통해이를 수행 할 수 있습니다. 그것들은 이미 이름을 가진 메소드에 대한 콤팩트하고 읽기 쉬운 람다 식입니다.
몇 가지 이유로 메서드 참조 구문보다 람다 구문을 선호합니다.
람다는 더 명확하다
오라클의 주장에도 불구하고 메소드 참조 구문이 모호하기 때문에 객체 메소드 참조보다 람다 구문을 쉽게 읽을 수 있습니다.
Bar::foo
x 클래스에서 정적 단일 인수 메소드를 호출하고 x를 전달하고 있습니까?
x -> Bar.foo(x)
아니면 x에서 인수가없는 인스턴스 메소드를 호출하고 있습니까?
x -> x.foo()
메소드 참조 구문은 둘 중 하나에 해당 될 수 있습니다. 실제로 코드가 수행하는 작업을 숨 깁니다.
람다는 더 안전하다
Bar :: foo를 클래스 메서드로 참조하고 나중에 Bar가 동일한 이름 (또는 그 반대)의 인스턴스 메서드를 추가하면 코드가 더 이상 컴파일되지 않습니다.
람다를 일관되게 사용할 수 있습니다
모든 함수를 람다로 감쌀 수 있으므로 어디에서나 동일한 구문을 일관되게 사용할 수 있습니다. 메소드 참조 구문은 기본 배열을 가져 오거나 리턴하거나, 확인 된 예외를 발생 시키거나 인스턴스 및 정적 메소드와 동일한 메소드 이름을 사용하는 메소드에서 작동하지 않습니다 (메소드 참조 구문이 호출되는 메소드에 대해 모호하기 때문에) . 동일한 수의 인수로 메소드를 오버로드하면 작동하지 않지만 어쨌든 그렇게하지 않아야합니다 (Josh Bloch의 항목 41 참조).
결론
그렇게 할 때 성능 저하가 없다면 IDE에서 경고를 끄고 가끔 메서드 참조를 코드에 뿌리지 않고 람다 구문을 일관되게 사용하고 싶습니다.
추신
여기나 거기에 있지 않지만 꿈에서 객체 메소드 참조는 다음과 같이 보이고 람다 래퍼없이 객체에서 직접 메소드에 대해 invoke-dynamic을 적용합니다.
_.foo()
.map(_.acceptValue())
: 내가 실수하지 않으면 이것은 스칼라 구문과 매우 비슷합니다. 어쩌면 당신은 잘못된 언어를 사용하려고했을 것입니다.
System.out::println
에 forEach()
... 모든 시간?