Saya punya daftar objek mengatakan car
. Saya ingin memfilter daftar ini berdasarkan beberapa parameter menggunakan Java 8. Tetapi jika parameternya null
, itu melempar NullPointerException
. Bagaimana cara menyaring nilai nol?
Kode saat ini adalah sebagai berikut
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
Ini melempar NullPointerException
jika getName()
kembali null
.
Jawaban:
Dalam contoh khusus ini saya pikir @ Tagir 100% benar, masukkan ke dalam satu filter dan lakukan dua pemeriksaan. Saya tidak akan menggunakan
Optional.ofNullable
hal-hal Opsional benar-benar untuk jenis kembali tidak melakukan logika ... tapi benar-benar tidak penting.Saya ingin menunjukkan bahwa
java.util.Objects
ada metode yang bagus untuk ini dalam kasus yang luas, sehingga Anda dapat melakukan ini:Yang akan menghapus objek nol Anda. Bagi siapa pun yang tidak terbiasa, itulah kependekan dari yang berikut:
Untuk sebagian menjawab pertanyaan yang ada untuk mengembalikan daftar nama mobil yang dimulai dengan
"M"
:Setelah Anda terbiasa dengan steno lambda Anda juga bisa melakukan ini:
Sayangnya begitu Anda,
.map(Car::getName)
Anda hanya akan mengembalikan daftar nama, bukan mobil. Jadi kurang cantik tapi sepenuhnya menjawab pertanyaan:sumber
Objects::nonNull
tidak dapat digunakan di sini, dan dalam saran terakhir saya haruscars.stream() .filter(car -> Objects.nonNull(car.getName()))
percayacars.stream() .filter(car -> Objects.nonNull(car.getName()) && car.getName().startsWith("M"))
akan menjadi ringkasan saran Anda dalam konteks pertanyaan ini.startWith
juga bisa menyebabkan null pointer. Poin yang saya coba buat adalah bahwa Java memasok metode khusus untuk memfilter objek nol dari aliran Anda.Objects.nonNull
sama dengan!= null
, opsi Anda lebih pendekString
) alih-alih mobil (Car
)?Anda hanya perlu memfilter mobil yang memiliki
null
nama:sumber
Jawaban yang diajukan sangat bagus. Hanya ingin menyarankan perbaikan untuk menangani kasus daftar nol menggunakan
Optional.ofNullable
, fitur baru di Java 8 :Jadi, jawaban lengkapnya adalah:
sumber
Objects::nonNull
tidak menyelesaikan masalah karena mobil non-null dapat memiliki nama == nullAnda dapat melakukan ini dalam langkah filter tunggal:
Jika Anda tidak ingin menelepon
getName()
beberapa kali (misalnya, ini panggilan mahal), Anda dapat melakukan ini:Atau dengan cara yang lebih canggih:
sumber
Memanfaatkan kekuatan
java.util.Optional#map()
:sumber
Anda bisa menggunakan ini
sumber