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.