Le code suivant renvoie un Future
.
findUserFuture.flatMap {....} .recover{...}
Ensuite, je traite le Future
val findUserFuture: Future[Option[User]] = userRepo.findOne(userKeys)
3 Réponses :
Vous pouvez également utiliser map
puis match
le résultat ..
Example: import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global val findUserFuture: Future[Option[User]] = userRepo.findOne(userKeys) findUserFuture.map { case Some(v) => println(v) // Not Null... case None => println(None) // None or Empty result.. } Hope it helps.
Si findOne ()
renvoie un null
, alors le mappage dessus lancera NPE.
Si null
alors vous pouvez changer case None =>
avec case _ =>
pour gérer tout ce qui ne correspond pas au premier.
Non. null.map {...
lancera avant que tout cas
ne soit évalué.
Mais fondamentalement, ce ne sera pas null
car le type de retour est Future [Option [User]]
donc peut-être que vous obtiendrez soit Future (Some (User (. ...)))
ou Future (None)
:)
Essayez ceci: val findUserFuture: Future [Option [User]] = null
Cela compile. Maintenant, map ()
dessus. Il compilera également, mais ne fonctionnera pas.
Je vois maintenant que je comprends votre point, mais si cela se produit, c'est un peu moche, et vous devez réparer votre fonction userRepo.findOne (userKeys)
. :)
findUserFuture match {case v: Future [Option [User]] => v case _ => Some (None)} map {case Some (v) => println (v) // Not Null ... case None => println (Aucun) // Aucun ou Résultat vide ..}
Je suis d'accord. Renvoyer null
n'est pas bon, mais c'est exactement ce que l'OP demande: "Mais que se passe-t-il si findOne
renvoie null
?"
Si cela se produit, un simple match
ou if statement
suffit pour cela.
Et aussi pour que votre fonction ne réponde pas avec null
Vous pouvez définir la valeur par défaut
sur votre fonction.
OK, alors arrêtez d'ajouter plus de commentaires et modifiez votre réponse afin qu'elle réponde réellement aux questions que l'OP pose réellement.
Il y a une différence entre le résultat du Future
et le Future
lui-même, et entre null
et None code >.
null
est un hang-over de Java qui n'est généralement pas utilisé dans Scala. La seule façon dont le Future
lui-même pourrait être null
est si findOne
retournait null
, ce qui est très peu probable. Donc tester le Future
lui-même ne sera pas utile.
Le résultat du futur est Option [User]
donc le code à l'intérieur de la flatMap
donnera une valeur qui est soit Some (user) code> ou
Aucun
. Vous pouvez utiliser les méthodes standard Option
pour tester cette valeur. En règle générale, vous correspondez
à la valeur ou appelez map
pour traiter le contenu, s'il est présent. Il existe de nombreuses réponses stackoverflow qui expliquent comment décocher une valeur Option
en toute sécurité.
Notez que la valeur de Option [User]
pourrait être null
mais, encore une fois, cela est très improbable et serait une erreur dans la bibliothèque.
Si findOne ()
peut renvoyer null
(vraiment? semble douteux), alors une chose que vous pourriez faire est de transformer le null
en une instance du type attendu ...
val findUserFuture: Future[Option[User]] = Option(userRepo.findOne(userKeys)) .getOrElse(Future(None))
... puis continuez le traitement normalement.
Merci. Je suppose que vous appelez apply
de l'objet compagnon Option
( apply [A] (x: A): Option [A]
) qui crée < code> Some (x) si l'argument n'est pas nul, et None
s'il est nul. - scala-lang.org/api/current/scala/Option$ .html
Utilisez: Future.successful (None)
- il n'est pas nécessaire d'évaluer None de manière asynchrone.
On ne sait pas quel cas vous attendez.
Future
contient une valeur denull
ouFuture
lui-même estnull
.