Scala: Je n'ai besoin d'effectuer une action que si le futur précédent a renvoyé Some (x). quelle meilleure façon de faire cela que d'utiliser le code ci-dessous
def tryThis: Future[Option[T]] = {...} val filteredFuture = tryThis.filter(_.exists(_ => true)) def abc = filteredFuture.map( _ => {...})
4 Réponses :
Vous pouvez remplacer:
tryThis.filter(_.isDefined)
par:
tryThis.filter(_.exists(_ => true))
Merci pour _.isDefined
@ senjin.hajrulahovic, comme je suis stupide d'écrire ceci _.exists (_ => true)
import scala.concurrent.ExecutionContext.Implicits.global def square(a: Int): Future[Option[Int]] = Future.successful(Option(a * a)) def printResult(a: Int): Unit = println(s"Result: $a") square(2).foreach(_.map(printResult)) EDIT: As per @Thilo suggestion
foreach
ou andThen
semble plus approprié s'il n'y a pas de valeur de retour et seulement un effet secondaire.
Le meilleur moyen est d'appeler map
sur l ' Option
comme ceci:
tryThis.map(_.map(_ => {...}))
Cela n'appellera la fonction que si le Future renvoie Some (x)
. Le résultat sera un autre Future [Option [U]]
où U
est le résultat de votre fonction.
Notez que cela renverra Future (None)
si l ' Option
d'origine était None
, alors que filter
générera une exception échouée, donc ils ne le font pas faites la même chose.
def tryThis: Future[Option[T]] = {...} // Resulting future will be failed if it a None // and its type will be that of the expression in `xâ¦` def abc = tryThis collect { case Some(x) => x⦠} // Resulting future will be a None if it was a None // and a Some with the type of the expression in `xâ¦` def abc = tryThis map { _.map(x => xâ¦) }
Vous devriez probablement expliquer que vos deux solutions produisent des résultats différents.
@Tim Good call — modifié.
Notez également que
filter
échouera dans le futur (avec une exception très générique), donc ce n'est probablement pas ce que vous voulez.