Saya memiliki kode di bawah ini yang agak jelek untuk beberapa pemeriksaan nol.
String s = null;
if (str1 != null) {
s = str1;
} else if (str2 != null) {
s = str2;
} else if (str3 != null) {
s = str3;
} else {
s = str4;
}
Jadi saya mencoba menggunakan Optional.ofNullable
seperti di bawah ini, tetapi masih sulit untuk dipahami jika seseorang membaca kode saya. apa pendekatan terbaik untuk melakukannya di Java 8.
String s = Optional.ofNullable(str1)
.orElse(Optional.ofNullable(str2)
.orElse(Optional.ofNullable(str3)
.orElse(str4)));
Di Java 9, kita bisa menggunakan Optional.ofNullable
dengan OR
, Tapi di Java8 apakah ada pendekatan lain?
or
Sintaks Java9String s = Optional.ofNullable(str1) .or(() -> Optional.ofNullable(str2)) .or(() -> Optional.ofNullable(str3)) .orElse(str4);
terlihat tidak sebaik yangStream.of
saya lakukan sya.StringUtils.firstNonBlank()
Jawaban:
Anda dapat melakukannya seperti ini:
sumber
{str1, str2, str3}
) terlihat jauh lebih lambat daripada lokalif
atau?:
, yang dapat dioptimalkan oleh runtime Java. Apakah ada beberapa pengoptimalan khusus Streamjavac
dan runtime Java yang membuatnya secepat itu?:
? Jika tidak, saya tidak akan merekomendasikan solusi ini dalam kode kinerja-kritis.?:
kode dan saya yakin Anda harus menghindarinya dalam kode kinerja-kritis. Namun itu jauh lebih mudah dibaca dan Anda harus merekomendasikannya dalam kode IMO non-kinerja-kritis, yang saya yakin membuat lebih dari 99% kode.javac
maupun dalam waktu proses. Ini tidak menghalangi pengoptimalan umum, seperti menyebariskan semua kode, diikuti dengan menghilangkan operasi yang berlebihan. Pada prinsipnya, hasil akhirnya bisa seefisien ekspresi kondisional biasa, namun, agak tidak mungkin itu pernah sampai di sana, karena runtime akan menghabiskan upaya yang diperlukan hanya pada jalur kode terpanas.str4
parameterStream.of(...)
dan penggunaanorElse(null)
pada akhirnya.Bagaimana dengan operator kondisional terner?
sumber
// take first non-null of str1..3
. Setelah Anda mengetahui fungsinya, akan mudah untuk melihat caranya.?:
tangga, Anda akan tahu fungsinya. (Btw, programmer fungsional tahu ini sebagai(cond ...)
klausul: Itu selalu penjaga diikuti dengan nilai yang sesuai untuk digunakan ketika penjaga itu benar.)Anda juga bisa menggunakan loop:
sumber
Jawaban saat ini bagus tetapi Anda benar-benar harus memasukkannya ke dalam metode utilitas:
Metode itu telah ada di
Util
kelas saya selama bertahun-tahun, membuat kode jauh lebih bersih:Anda bahkan dapat membuatnya menjadi generik:
sumber
Arrays.stream()
ketika saya dapat melakukan hal yang sama dengan afor
dan a!= null
, yang lebih efisien. Dan Todd benar. Namun, ketika saya mengkodekan metode ini, saya mencari cara untuk melakukan ini menggunakan fitur Java 8, seperti OP, jadi begitulah.Saya menggunakan fungsi pembantu, seperti
Kemudian kode semacam ini dapat ditulis sebagai
sumber
v0
parameter ekstra ?min
sebagai contoh.) Saya kurang yakin bahwa ini tepat di sini.firstNonNull(arr)
mengembalikan arr jika bukan null. Jika itu adalahfirstNonNull(T... vs)
sebaliknya akan mengembalikan entri non-null pertama di arr.Solusi yang dapat diterapkan ke sebanyak mungkin elemen yang Anda inginkan adalah:
Anda dapat membayangkan solusi seperti di bawah ini, tetapi yang pertama memastikan
non nullity
semua elemensumber
str4
meskipun itu menjadi nol sebenarnyaorElseNull
, yang jumlahnya sama jikastr4
null.Anda juga dapat menggabungkan semua String ke dalam array String lalu melakukan perulangan for untuk memeriksa dan memutuskan dari perulangan setelah ditetapkan. Dengan asumsi s1, s2, s3, s4 semuanya adalah String.
Diedit untuk memasukkan kondisi default ke s4 jika tidak ada yang ditetapkan.
sumber
s4
(ataustr4
), yang seharusnya ditetapkans
pada akhirnya, bahkan jika nilainya null.Berbasis metode dan sederhana.
Dan gunakan sebagai:
Ini mudah dilakukan dengan array dan terlihat cantik.
sumber
Jika Anda menggunakan Apache Commons Lang 3 maka dapat ditulis seperti ini:
Penggunaan
ObjectUtils.firstNonNull(T...)
diambil dari jawaban ini . Pendekatan yang berbeda juga disajikan dalam pertanyaan terkait .sumber