Estoy tratando de comprender el ifPresent()
método de laOptional
API en Java 8.
Tengo una lógica simple:
Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));
Pero esto resulta en un error de compilación:
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
Por supuesto que puedo hacer algo como esto:
if(user.isPresent())
{
doSomethingWithUser(user.get());
}
Pero esto es exactamente como un desordenado null
cheque .
Si cambio el código a esto:
user.ifPresent(new Consumer<User>() {
@Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
El código se está volviendo más sucio, lo que me hace pensar en volver al antiguo null
cheque anterior.
¿Algunas ideas?
user.ifPresent(this::doSomethingWithUser);
Optional<User>
menudo no es necesario almacenarla en una variable local. Simplemente encadena las llamadas al método:funcThatMightReturnUser().ifPresent(this::doSomethingWithUser);
Además de la respuesta de @ JBNizet, mi caso de uso general
ifPresent
es combinar.isPresent()
y.get()
:Vieja forma:
Nueva manera:
Esto, para mí, es más intuitivo.
fuente
¿Por qué escribir código complicado cuando podrías hacerlo simple?
De hecho, si absolutamente va a utilizar la
Optional
clase, el código más simple es el que ya ha escrito ...Este código tiene las ventajas de ser
El hecho de que Oracle haya agregado la
Optional
clase en Java 8 no significa que esta clase deba usarse en todas las situaciones.fuente
Utilice flatMap. Si hay un valor presente, flatMap devuelve una secuencia secuencial que contiene solo ese valor; de lo contrario, devuelve una secuencia vacía. Entonces no hay necesidad de usar
ifPresent()
. Ejemplo:fuente
Puede usar una referencia de método como esta:
El método
ifPresent()
obtiene elConsumer
objeto como parámetro y (de JavaDoc ): "Si hay un valor, invoca al consumidor especificado con el valor". Valora es tu variableuser
.O si este método
doSomethingWithUser
está en laUser
clase y no lo estástatic
, puede usar una referencia de método como esta:fuente
user.ifPresent(new ClassNameWhereMethodIs()::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
. Lo agregaré a mi respuesta.