'Opsional.get ()' tanpa 'isPresent ()'

92

Saya memiliki kode pencarian berikut di Java:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();

Saya ingin menemukan kolom dengan nama dan mengembalikan yang pertama ditemukan.

Saya mengerti ada kasus ketika tidak ada yang ditemukan dan harus diproses, tapi bagaimana caranya?

Apakah ini yang diinginkan dengan sumpah ini:

'Optional.get()' without 'isPresent()' check

?

Bagaimana cara memperbaiki? Saya ingin kembali nulljika tidak ditemukan.

MEMPERBARUI

Oke, oke, saya hanya tidak menyadari, itu findFirst()kembali Optional.

Redup
sumber
2
Perhatikan bahwa Anda tidak boleh menggunakan $sebagai pengenal di Java: JLS Sec 3.8 : "Tanda $ harus digunakan hanya dalam kode sumber yang dibuat secara mekanis atau, jarang, untuk mengakses nama yang sudah ada sebelumnya di sistem lama."
Andy Turner

Jawaban:

187

Ganti get()dengan orElse(null).

Andy Turner
sumber
1
Mengapa? :) Mengapa orElsedimulai dengan "atau"?
Redup pada
15
Karena itulah nama metodenya. Dan elsemerupakan kata kunci.
Andy Turner
8
@Dims itu hanyalah bentuk singkat dari getOrElse, hanya meninggalkan get. Dengan opsional, Anda biasanya harus menggunakan orElsebukan getkarena getakan memunculkan pengecualian jika nilainya null.
puhlen
4
@puhlen orElseGet()membutuhkan a Supplier<T>, sedangkan orElse()membutuhkan T. Ini tidak setara.
bcsb1001
2
@ bcsb1001 bukan itu yang dia coba katakan, "getOrElse" adalah nama yang dia ciptakan untuk menjelaskan tujuan orElse; tidak ada referensi orElseGetdalam komentarnya;)
Rorrim
22
...findFirst().orElse(null);

Mengembalikan nilai jika ada, jika tidak mengembalikan null. Dokumentasi mengatakan bahwa parameter yang diteruskan mungkin null(apa yang dilarang orElseGetdan orElseThrow).

Andrew Tobilko
sumber
1
itu sebagian benar. findFirst () memiliki aturan berikut: "Ketika tidak ada urutan pertemuan, ia mengembalikan elemen apa pun dari Stream." -> jadi jika filter Anda tidak mengembalikan elemen yang cocok, findFirst () akan mengembalikan yang pertama (kecuali aliran kosong sebelumnya)
Fl0R1D3R
1

solusi saya adalah memeriksanya dengan cara ini

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}
Iklan Yakup
sumber
0

Opsional dibuat sehingga kode bisa setelah beberapa dekade ini, akhirnya mulai menghindar null.

Hapus .get (), kembalikan Opsional itu sendiri dan buat kode panggilan menanganinya dengan tepat (seperti yang harus dilakukan jika Anda mengembalikan null).

Erwin Smout
sumber