En Java 8, je veux faire quelque chose à un Optional
objet s'il est présent, et faire autre chose s'il n'est pas présent.
if (opt.isPresent()) {
System.out.println("found");
} else {
System.out.println("Not found");
}
Ce n'est cependant pas un «style fonctionnel».
Optional
a une ifPresent()
méthode, mais je ne peux pas enchaîner une orElse()
méthode.
Ainsi, je ne peux pas écrire:
opt.ifPresent( x -> System.out.println("found " + x))
.orElse( System.out.println("NOT FOUND"));
En réponse à @assylias, je ne pense pas que cela Optional.map()
fonctionne pour le cas suivant:
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;
});
Dans ce cas, lorsqu'il opt
est présent, je mets à jour sa propriété et l'enregistre dans la base de données. Lorsqu'il n'est pas disponible, j'en crée un nouveau obj
et l'enregistre dans la base de données.
Remarque dans les deux lambdas je dois revenir null
.
Mais quand il opt
est présent, les deux lambdas seront exécutés. obj
sera mis à jour et un nouvel objet sera enregistré dans la base de données. C'est à cause de return null
la première lambda. Et orElseGet()
continuera à exécuter.
return null;
par return o;
(les deux). Cependant, j'ai le fort sentiment que vous travaillez au mauvais endroit. Vous devriez travailler sur le site qui a produit cela Optional
. À cet endroit, il devrait y avoir un moyen d'effectuer l'opération souhaitée sans l'intermédiaire Optional
.
ifPresent
cela contredit. Toutes les autres méthodes font référence à la valeur et non aux actions.