En Java 8, quiero hacer algo a un Optional
objeto si está presente, y hacer otra cosa si no está presente.
if (opt.isPresent()) {
System.out.println("found");
} else {
System.out.println("Not found");
}
Sin embargo, este no es un 'estilo funcional'.
Optional
tiene un ifPresent()
método, pero no puedo encadenar un orElse()
método.
Por lo tanto, no puedo escribir:
opt.ifPresent( x -> System.out.println("found " + x))
.orElse( System.out.println("NOT FOUND"));
En respuesta a @assylias, no creo que Optional.map()
funcione para el siguiente caso:
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;
});
En este caso, cuando opt
está presente, actualizo su propiedad y la guardo en la base de datos. Cuando no está disponible, creo uno nuevo obj
y lo guardo en la base de datos.
Nota en las dos lambdas tengo que volver null
.
Pero cuando opt
está presente, ambas lambdas se ejecutarán. obj
se actualizará y se guardará un nuevo objeto en la base de datos. Esto se debe return null
a la primera lambda. Y orElseGet()
continuará ejecutándose.
return null;
con return o;
(ambos). Sin embargo, tengo la fuerte sensación de que estás trabajando en el lugar equivocado. Deberías trabajar en el sitio que produjo eso Optional
. En ese lugar debe haber una forma de realizar la operación deseada sin el intermedio Optional
.
ifPresent
esto contradice esto. Todos los demás métodos se refieren al valor y no a las acciones.