4
votes

comment vérifier qu'un futur n'est pas nul

Le code suivant renvoie un Future.

findUserFuture.flatMap {....}
.recover{...}

Ensuite, je traite le Future

val findUserFuture: Future[Option[User]] = userRepo.findOne(userKeys) 


1 commentaires

On ne sait pas quel cas vous attendez. Future contient une valeur de null ou Future lui-même est null .


3 Réponses :


1
votes

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.


11 commentaires

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.



9
votes

Il y a une différence entre le résultat du Future et le Future lui-même, et entre null et None .

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) 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.


0 commentaires

3
votes

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.


2 commentaires

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.