Pertama-tama periksa deklarasi kedua metode.
1) OrElse: Jalankan logika dan berikan hasil sebagai argumen.
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: Jalankan logika jika nilai di dalam opsional adalah nol
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
Beberapa penjelasan tentang deklarasi di atas:
Argumen "Optional.orElse" selalu dieksekusi terlepas dari nilai objek dalam opsional (nol, kosong atau dengan nilai). Selalu pertimbangkan hal yang disebutkan di atas dalam pikiran saat menggunakan "Optional.orElse", jika tidak, gunakan "Optional.orElse" bisa sangat berisiko dalam situasi berikut.
Risiko-1) Masalah Pencatatan: Jika konten di dalam orElse berisi pernyataan log apa pun: Dalam hal ini, Anda pada akhirnya akan mencatatnya setiap waktu.
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
Risiko-2) Masalah Kinerja: Jika konten di dalam orElse padat waktu: Konten intensif waktu dapat berupa operasi DB panggilan, panggilan API, pembacaan file. Jika kami menaruh konten seperti itu di orElse (), sistem pada akhirnya akan mengeksekusi kode yang tidak digunakan.
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
Risiko-3) Keadaan Ilegal atau Masalah Bug: Jika konten di dalam orElse mengubah beberapa status objek: Kami mungkin menggunakan objek yang sama di tempat lain, misalkan dalam fungsi Optional.map dan itu dapat menempatkan kami dalam bug kritis.
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
Lalu, Kapan kita bisa menggunakan OrElse ()?
Lebih suka menggunakan orElse ketika nilai default adalah beberapa objek konstan, enum. Dalam semua kasus di atas kita bisa menggunakan Optional.orElseGet () (yang hanya dijalankan ketika Opsional berisi nilai yang tidak kosong) alih-alih Optional.orElse (). Mengapa?? Di orElse, kami meneruskan nilai hasil default, tetapi di orElseGet kami melewati Pemasok dan metode Pemasok hanya dijalankan jika nilai dalam Opsional adalah nol.
Pengambilan kunci dari ini:
- Jangan gunakan "Optional.orElse" jika berisi pernyataan log.
- Jangan gunakan "Optional.orElse" jika mengandung logika waktu-intensif.
- Jangan gunakan "Optional.orElse" jika itu bermutasi beberapa keadaan objek.
- Gunakan "Optional.orElse" jika kita harus mengembalikan konstanta, enum.
- Pilih "Optional.orElseGet" dalam situasi yang disebutkan dalam poin 1,2 dan 3.
Saya telah menjelaskan hal ini pada poin-2 ( “Optional.map/Optional.orElse”! = “If / else” ) blog medium saya. Gunakan Java8 sebagai programmer bukan sebagai coder
orElseGet
hanya memanggil pemasok jika nilainya tidak ada.