Saya mencoba memahami ifPresent()
metode Optional
API di Java 8.
Saya memiliki logika sederhana:
Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));
Tetapi ini menghasilkan kesalahan kompilasi:
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
Tentu saja saya bisa melakukan sesuatu seperti ini:
if(user.isPresent())
{
doSomethingWithUser(user.get());
}
Tapi ini persis seperti null
cek yang berantakan .
Jika saya mengubah kodenya menjadi ini:
user.ifPresent(new Consumer<User>() {
@Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
Kode menjadi semakin kotor, yang membuat saya berpikir untuk kembali ke null
cek lama .
Ada ide?
user.ifPresent(this::doSomethingWithUser);
Optional<User>
seringkali tidak perlu menyimpannya dalam variabel lokal. Cukup rantai panggilan metode:funcThatMightReturnUser().ifPresent(this::doSomethingWithUser);
Selain jawaban @ JBNizet, kasus penggunaan umum saya
ifPresent
adalah untuk menggabungkan.isPresent()
dan.get()
:Cara lama:
Optional opt = getIntOptional(); if(opt.isPresent()) { Integer value = opt.get(); // do something with value }
Jalan baru:
Optional opt = getIntOptional(); opt.ifPresent(value -> { // do something with value })
Ini, bagi saya, lebih intuitif.
sumber
Mengapa menulis kode yang rumit padahal Anda bisa membuatnya sederhana?
Memang, jika Anda benar-benar akan menggunakan
Optional
kelas, kode paling sederhana adalah yang telah Anda tulis ...if (user.isPresent()) { doSomethingWithUser(user.get()); }
Kode ini memiliki keuntungan menjadi
Hanya karena Oracle telah menambahkan
Optional
kelas di Java 8 tidak berarti bahwa kelas ini harus digunakan di semua situasi.sumber
Gunakan flatMap. Jika ada nilai, flatMap mengembalikan Stream berurutan yang hanya berisi nilai itu, jika tidak, mengembalikan Stream kosong. Jadi tidak perlu digunakan
ifPresent()
. Contoh:list.stream().map(data -> data.getSomeValue).map(this::getOptinalValue).flatMap(Optional::stream).collect(Collectors.toList());
sumber
Anda dapat menggunakan referensi metode seperti ini:
Metode
ifPresent()
dapatkanConsumer
objek sebagai paremeter dan (dari JavaDoc ): "Jika ada nilai, panggil konsumen yang ditentukan dengan nilai tersebut." Nilai itu adalah variabel Andauser
.Atau jika metode ini
doSomethingWithUser
ada diUser
kelas dan tidakstatic
, Anda dapat menggunakan referensi metode seperti ini:user.ifPresent(this::doSomethingWithUser);
sumber
user.ifPresent(new ClassNameWhereMethodIs()::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
. Saya akan menambahkannya ke jawaban saya.