J'essaie de comprendre la ifPresent()
méthode de l' Optional
API dans Java 8.
J'ai une logique simple:
Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));
Mais cela entraîne une erreur de compilation:
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
Bien sûr, je peux faire quelque chose comme ça:
if(user.isPresent())
{
doSomethingWithUser(user.get());
}
Mais c'est exactement comme un null
chèque encombré .
Si je change le code en ceci:
user.ifPresent(new Consumer<User>() {
@Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
Le code est de plus en plus sale, ce qui me fait penser à revenir à l'ancien null
chèque.
Des idées?
user.ifPresent(this::doSomethingWithUser);
Optional<User>
il n'est souvent pas nécessaire de la stocker dans une variable locale. Il suffit d'enchaîner les appels de méthode:funcThatMightReturnUser().ifPresent(this::doSomethingWithUser);
En plus de la réponse de @ JBNizet, mon cas d'utilisation général
ifPresent
est de combiner.isPresent()
et.get()
:Ancienne façon:
Nouvelle façon:
Ceci, pour moi, est plus intuitif.
la source
Pourquoi écrire du code compliqué alors que vous pouviez le simplifier?
En effet, si vous allez absolument utiliser la
Optional
classe, le code le plus simple est celui que vous avez déjà écrit ...Ce code présente les avantages d'être
Ce
Optional
n'est pas parce qu'Oracle a ajouté la classe dans Java 8 que cette classe doit être utilisée dans toutes les situations.la source
Utilisez flatMap. Si une valeur est présente, flatMap renvoie un Stream séquentiel contenant uniquement cette valeur, sinon renvoie un Stream vide. Il n'y a donc pas besoin d'utiliser
ifPresent()
. Exemple:la source
Vous pouvez utiliser une référence de méthode comme celle-ci:
Méthode
ifPresent()
getConsumer
object comme paramètre et (à partir de JavaDoc ): "Si une valeur est présente, invoquez le consommateur spécifié avec la valeur." Value it est votre variableuser
.Ou si cette méthode
doSomethingWithUser
est dans laUser
classe et qu'elle ne l'est passtatic
, vous pouvez utiliser une référence de méthode comme celle-ci:la source
user.ifPresent(new ClassNameWhereMethodIs()::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
. Je vais l'ajouter à ma réponse.