W Javie 8 chcę zrobić coś z Optional
obiektem, jeśli jest obecny, i zrobić coś innego, jeśli go nie ma.
if (opt.isPresent()) {
System.out.println("found");
} else {
System.out.println("Not found");
}
Nie jest to jednak „funkcjonalny styl”.
Optional
ma ifPresent()
metodę, ale nie mogę połączyć orElse()
metody.
Dlatego nie mogę napisać:
opt.ifPresent( x -> System.out.println("found " + x))
.orElse( System.out.println("NOT FOUND"));
W odpowiedzi na @assylias nie sądzę, że Optional.map()
działa w następującym przypadku:
opt.map( o -> {
System.out.println("while opt is present...");
o.setProperty(xxx);
dao.update(o);
return null;
}).orElseGet( () -> {
System.out.println("create new obj");
dao.save(new obj);
return null;
});
W takim przypadku, gdy opt
jest obecny, aktualizuję jego właściwość i zapisuję w bazie danych. Kiedy nie jest dostępny, tworzę nowy obj
i zapisuję w bazie danych.
Uwaga w dwóch lambdach muszę wrócić null
.
Ale kiedy opt
będzie obecny, oba lambdas zostaną stracone. obj
zostanie zaktualizowany, a nowy obiekt zostanie zapisany w bazie danych. Wynika to z return null
pierwszej lambda. I orElseGet()
będzie nadal działać.
return null;
z return o;
(oba). Mam jednak silne przeczucie, że pracujesz w niewłaściwym miejscu. Powinieneś pracować w witrynie, która go wyprodukowała Optional
. W tym miejscu powinien istnieć sposób wykonania żądanej operacji bez pośrednika Optional
.
ifPresent
zaprzecza to. Wszystkie inne metody odnoszą się do wartości, a nie do akcji.