Tidak ada predikat bawaan selalu benar dan selalu salah di Jawa 8. Cara paling ringkas untuk menulis ini adalah
x -> true
dan
x -> false
Bandingkan ini dengan
Predicates.alwaysTrue() // Guava
dan akhirnya ke kelas batin anonim:
new Predicate<Object>() {
public boolean test(Object x) {
return true;
}
}
Mungkin alasan bahwa Guava memiliki predikat bawaan ini adalah bahwa ada keuntungan sintaksis yang sangat besar dari pemanggilan metode statis melalui kelas dalam anonim. Di Java 8, sintaks lambda begitu ringkas sehingga ada kerugian sintaksis untuk menuliskan pemanggilan metode statis.
Itu hanya perbandingan sintaksis. Mungkin ada keuntungan ruang kecil jika ada satu predikat global selalu-benar tunggal, dibandingkan dengan x -> true
kejadian yang tersebar di beberapa kelas, masing-masing akan menciptakan contoh predikat sendiri. Apakah ini yang Anda khawatirkan? Penghematan tampaknya tidak menarik, yang mungkin mengapa mereka tidak ditambahkan pada awalnya. Tapi itu bisa dipertimbangkan untuk rilis di masa depan.
UPDATE 2015-04-24
Kami telah dianggap penambahan berbagai statis, bernama fungsi seperti Predicate.alwaysTrue
, Runnable.noop
, dll, dan kami telah memutuskan untuk tidak menambah lagi di masa depan versi Java SE.
Tentu saja ada beberapa nilai dalam sesuatu yang memiliki nama vs lambda yang ditulis, tetapi nilai ini cukup kecil. Kami berharap orang akan belajar membaca dan menulis x -> true
dan () -> { }
penggunaannya akan menjadi idiomatis. Bahkan nilai Function.identity()
lebih x -> x
dipertanyakan.
Ada keuntungan kinerja yang sangat kecil untuk menggunakan kembali fungsi yang sudah ada alih-alih mengevaluasi lambda yang sudah dihapus, tetapi kami berharap penggunaan fungsi-fungsi semacam ini sangat kecil sehingga keuntungan seperti itu dapat diabaikan, tentu saja tidak sebanding dengan mengasapi API.
Holger juga menyebutkan dalam komentar kemungkinan mengoptimalkan fungsi-fungsi tersusun seperti Predicate.or
dan semacamnya. Ini juga dipertimbangkan ( JDK-8067971 ) tetapi dianggap agak rapuh dan rawan kesalahan, dan jarang terjadi sehingga tidak layak untuk diimplementasikan.
Lihat juga entri FAQ Lambda ini .
(foo)->{return true;}
yang terbaik yang bisa saya lakukan, saya ingin yang lebih baik. Tapi Anda mengemukakannyax->true
, yang jauh lebih baik dan mengurangi masalah pertama. Masalah kedua adalah deklarasi logika vs statis. Jika saya menggunakanx->true
, masih ada logika yang terlibat, yang saya dapat secara tidak sengaja mengacaukan (misalnyax->!true
). Tetapi denganPredicate.alwaysTrue()
, tidak ada ruang untuk kesalahan logika, karena hanya ada satu atau dua metode serupa. Ditambah lagi, saya mendapatkan penyelesaian kode IDE secara gratis.x->true
hampir baik-baik saja, tetapi saya masih menulisPredicate.alwaysTrue()
metode untuk alasan di atas.Predicate.alwaysTrue()
Anda juga bisa mengacaukan dengan menulis secara tidak sengajaPredicate.alwaysFalse()
.alwaysTrue()
danalwaysFalse()
. Dengan lambda yang sebenarnya, saya memiliki banyak variasi; Saya pada dasarnya merekonstruksi formula setiap kali. Intinya,alwaysTrue()
adalah label semantik untuk apa yang ingin saya lakukan;x->true
sebenarnya melakukannya lagi setiap kali. Bukan besar, tapi pertimbangan.Predicate.alwaysTrue()
danPredicate.alwaysFalse()
contoh adalah, bahwa mereka dapat diakui dengan menggabungkan metode sepertiPredicate.or
,Predicate.and
, danPredicate.negate()
. Ini akan memungkinkan untuk melakukan inisialisasiPredicate
variabel denganalwaysTrue()
dan menambahkan predikat dengan menggabungkan viaand
tanpa overhead. Karena ekspresi lambda tidak memiliki jaminan identitas objek, ini mungkin gagalx->true
. By the way, jika saya memiliki kelasX
denganstatic
metodey(){return true;}
, menggunakanX::y
bahkan lebih pendek daripadax->true
tetapi tidak benar-benar direkomendasikan ...x -> true
memiliki kelemahan yaitu saya harus menggunakan variabel tanpa menggunakan. Ini menciptakan beban otak yang tidak perlu dan juga peringatan di IDE saya. Saya mencoba menggunakan_ -> true
, tetapi itu adalah kesalahan sintaksis. Java jelas kehilangan kata kunci (baca: keyletter) untuk "parameter yang tidak digunakan". Berharap sesuatu seperti ini akan datang di Jawa 9 (atau setidaknya: Jawa apa pun sebelum aku mati ^^)Tanpa jambu biji
sumber
Predicate
, karena tidak butuh argumen.