Apakah referensi metode melewatkan overhead bungkus lambda? Mungkinkah mereka di masa depan?
Menurut Tutorial Java tentang Referensi Metode :
Terkadang ... ekspresi lambda tidak melakukan apa-apa selain memanggil metode yang ada. Dalam kasus tersebut, seringkali lebih jelas untuk merujuk pada metode yang ada dengan nama. Referensi metode memungkinkan Anda untuk melakukan ini; mereka adalah ekspresi lambda yang ringkas dan mudah dibaca untuk metode yang sudah memiliki nama.
Saya lebih suka sintaks lambda daripada sintaks referensi metode karena beberapa alasan:
Lambdas lebih jelas
Terlepas dari klaim Oracle, saya menemukan sintaks lambda lebih mudah dibaca daripada referensi metode objek secara langsung karena sintaks referensi metode bersifat ambigu:
Bar::foo
Apakah Anda memanggil metode satu argumen statis pada kelas x dan meneruskannya x?
x -> Bar.foo(x)
Atau apakah Anda memanggil metode instance argumen nol pada x?
x -> x.foo()
Sintaks referensi metode bisa bertahan untuk salah satu. Itu menyembunyikan apa yang sebenarnya dilakukan kode Anda.
Lambdas lebih aman
Jika Anda merujuk Bar :: foo sebagai metode kelas dan Bar kemudian menambahkan metode instance dengan nama yang sama (atau sebaliknya), kode Anda tidak akan lagi dikompilasi.
Anda dapat menggunakan lambdas secara konsisten
Anda dapat membungkus fungsi apa pun dalam lambda - sehingga Anda dapat menggunakan sintaksis yang sama secara konsisten di mana-mana. Sintaks referensi metode tidak akan bekerja pada metode yang mengambil atau mengembalikan array primitif, melempar pengecualian yang diperiksa, atau menggunakan nama metode yang sama digunakan sebagai instance dan metode statis (karena sintaks referensi metode tidak jelas tentang metode yang akan dipanggil) . Mereka tidak berfungsi ketika Anda memiliki metode yang berlebihan dengan jumlah argumen yang sama, tetapi Anda tidak harus tetap melakukannya (lihat item Josh Bloch 41) sehingga kami tidak dapat menentangnya terhadap referensi metode.
Kesimpulan
Jika tidak ada penalti kinerja untuk melakukannya, saya tergoda untuk mematikan peringatan di IDE saya dan menggunakan sintaks lambda secara konsisten tanpa menaburkan referensi metode sesekali ke dalam kode saya.
PS
Baik di sini maupun di sana, tetapi dalam mimpiku, referensi metode objek terlihat lebih seperti ini dan menerapkan invoke-dynamic terhadap metode langsung pada objek tanpa pembungkus lambda:
_.foo()
.map(_.acceptValue())
: Jika saya tidak salah, ini sangat mirip dengan sintaks Scala. Mungkin Anda hanya mencoba menggunakan bahasa yang salah.
System.out::println
untuk forEach()
sepanjang waktu ...?