Yöntem referansları lambda sargısının üst kısmını atlıyor mu? Gelecekte olabilirler mi?
Java Eğitim Kılavuzuna göre, Referanslar :
Bazen ... bir lambda ifadesi var olan yöntemi çağırmaktan başka bir şey yapmaz. Bu gibi durumlarda, mevcut yönteme ada göre başvurmak genellikle daha açıktır. Yöntem başvuruları bunu yapmanızı sağlar; Zaten bir adı olan yöntemler için kompakt, okunması kolay lambda ifadeleridir.
Lambda sözdizimini birkaç nedenden dolayı yöntem referans sözdizimine tercih ederim:
Lambdalar daha net
Oracle'ın iddialarına rağmen, lambda sözdizimini, yöntem başvurusu sözdiziminin belirsiz olması nedeniyle, kısa yoldan nesne yöntemi referansından daha kolay okunur buluyorum:
Bar::foo
X sınıfı üzerinde statik bir bağımsız değişken yöntemi mi çağırıyorsunuz ve x'i geçiyorsunuz?
x -> Bar.foo(x)
Yoksa x'te bir sıfır bağımsız değişken örneği yöntemi mi çağırıyorsunuz?
x -> x.foo()
Yöntem referansı sözdizimi, her ikisinde de bulunabilir. Kodunuzun gerçekte ne yaptığını gizler.
Lambdalar daha güvenlidir
Bar :: foo'ya bir sınıf yöntemi olarak başvurduysanız ve Bar daha sonra aynı adı taşıyan bir örnek yöntemi eklerse (veya tersi), kodunuz artık derlenmez.
Lambdaları sürekli olarak kullanabilirsiniz.
Herhangi bir işlevi bir lambdaya sarabilirsiniz - böylece aynı sözdizimini her yerde tutarlı bir şekilde kullanabilirsiniz. Yöntem referansı sözdizimi, ilkel dizileri alan ya da döndüren, kontrol edilen istisnalar atan ya da örnek ve statik bir yöntemle aynı yöntem adına sahip olan (çalışma yöntemi sözdiziminin hangi yöntemin çağrılacağı konusunda belirsiz olduğu için) aynı yöntem adına sahip olmayacak . Aynı sayıda argümanla aşırı yükleme yaptığınız zaman çalışmazlar, ancak yine de yapmamalısınız (bkz. Josh Bloch'un madde 41'i), bu yüzden metot referanslarına aykırı olamayız.
Sonuç
Bunu yapmak için herhangi bir performans cezası yoksa, IDE'mdeki uyarıyı kapatmaya çalışıyorum ve lambda sözdizimini, arada sırada olan yöntem referansını koduma sermeden kullanıyorum.
PS
Ne burada ne de orada, ama rüyamda, nesne yöntemi referansları daha çok benziyor ve lambda sargısı olmadan doğrudan nesne üzerinde yönteme karşı invoke-dinamik uygular:
_.foo()
.map(_.acceptValue())
: Yanılmıyorsam, bu Scala sözdizimine çok benziyor. Belki de yanlış dili kullanmaya çalışıyorsun.
System.out::println
için forEach()
... her zaman?