W Javie 8 chcę zrobić coś z Optionalobiektem, 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”.
Optionalma 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 optjest obecny, aktualizuję jego właściwość i zapisuję w bazie danych. Kiedy nie jest dostępny, tworzę nowy obji zapisuję w bazie danych.
Uwaga w dwóch lambdach muszę wrócić null.
Ale kiedy optbędzie obecny, oba lambdas zostaną stracone. objzostanie zaktualizowany, a nowy obiekt zostanie zapisany w bazie danych. Wynika to z return nullpierwszej 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.
ifPresentzaprzecza to. Wszystkie inne metody odnoszą się do wartości, a nie do akcji.