Saya baru saja mulai bermain dengan lambda Java 8 dan saya mencoba menerapkan beberapa hal yang biasa saya gunakan dalam bahasa fungsional.
Misalnya, sebagian besar bahasa fungsional memiliki semacam fungsi mencari yang beroperasi pada urutan, atau daftar yang mengembalikan elemen pertama, yang menjadi predikatnya true
. Satu-satunya cara saya bisa melihat untuk mencapai ini di Java 8 adalah:
lst.stream()
.filter(x -> x > 5)
.findFirst()
Namun ini tampaknya tidak efisien bagi saya, karena filter akan memindai seluruh daftar, setidaknya untuk pemahaman saya (yang mungkin salah). Apakah ada cara yang lebih baik?
java
java-8
java-stream
siki
sumber
sumber
Jawaban:
Tidak, filter tidak memindai seluruh aliran. Ini adalah operasi perantara, yang mengembalikan aliran malas (sebenarnya semua operasi perantara mengembalikan aliran malas). Untuk meyakinkan Anda, Anda dapat melakukan tes berikut:
Output yang mana:
Anda melihat bahwa hanya dua elemen pertama dari aliran yang benar-benar diproses.
Jadi Anda bisa pergi dengan pendekatan Anda yang sangat baik.
sumber
get();
sini karena saya tahu nilai mana yang saya berikan ke pipa aliran dan karenanya akan ada hasilnya. Dalam praktiknya, Anda tidak boleh menggunakanget();
, tetapiorElse()
/orElseGet()
/orElseThrow()
(untuk kesalahan yang lebih berarti daripada NSEE) karena Anda mungkin tidak tahu apakah operasi yang diterapkan pada pipa aliran akan menghasilkan elemen..findFirst().orElse(null);
misalnyaorElse
?Optional
tipe, yang merupakan apa yang.findFirst
dikembalikan. Salah satu penggunaan Opsional adalah untuk membantu pengembang menghindari keharusan berurusan dengannull
seg alih-alih mengecekmyObject != null
, Anda dapat memeriksamyOptional.isPresent()
, atau menggunakan bagian lain dari antarmuka Opsional. Apakah itu membuatnya lebih jelas?Tidak itu tidak akan - itu akan "pecah" segera setelah elemen pertama yang memenuhi predikat ditemukan. Anda dapat membaca lebih lanjut tentang kemalasan dalam paket stream javadoc , khususnya (penekanan saya):
sumber
Saya harus memfilter hanya satu objek dari daftar objek. Jadi saya menggunakan ini, semoga membantu.
sumber
.orElse(null) != null
. Sebagai gantinya, gunakan API opsional.isPresent
yaitu.findFirst().isPresent()
..stream().map(ParkingLot::getId).anyMatch(Predicate.isEqual(id))
Selain jawaban Alexis C , Jika Anda bekerja dengan daftar array, di mana Anda tidak yakin apakah elemen yang Anda cari ada, gunakan ini.
Maka Anda hanya bisa memeriksa apakah suatu adalah
null
.sumber
sumber
Jawaban One-Liner yang ditingkatkan: Jika Anda mencari nilai pengembalian boolean, kami dapat melakukannya dengan lebih baik dengan menambahkan isPresent:
sumber