Scala Avenir avec filtre pour la compréhension
Dans l'exemple ci-dessous j'ai accès à l'exception java.util.NoSuchElementException: Future.filter predicate is not satisfied
Je veux avoir le résultat Future( Test2 )
, quand la case if( i == 2 )
échoue. Comment dois-je traiter le filtre/si dans une compréhension qui traite de la composition des contrats à terme?
Ci-dessous est un exemple simplifié qui travaille à la Scala REPL.
Code:
import scala.concurrent.Future
import scala.util.{ Try, Success, Failure }
import scala.concurrent.ExecutionContext.Implicits.global
val f1 = Future( 1 )
val f2 = for {
i <- f1
if( i == 2 )
} yield "Test1"
f2.recover{ case _ => "Test2" }
f2.value
Vous devez vous connecter pour publier un commentaire.
Dans votre
for-comprehension
, vous êtes le filtrage pari == 2
. Parce que la valeur def1
n'est pas deux, il ne donnera pas unSuccess
mais plutôt unFailure
. Le prédicat de filtre n'est pas satisfait, que votre erreur message vous indique. Cependant,f2.recover
retourne une nouvelleFuture
. La valeur def2
n'est pas manipulé. Il stocke toujours lesFailure
. C'est la raison pour laquelle vous obtenez le message d'erreur lorsque vous appelezf2.value
.La seule alternative que je peux penser serait à l'aide d'un
else
dans votrefor-comprehension
comme le montre ici.Ce sera le retour de
Some(Success(Test2))
que votref3.value
n'.C'est un plus idiomatiques solution, à mon avis. Cette fonction de prédicat crée une
Future[Unit]
ou de l'échec d'un avenir contenant vos exception. Pour ton exemple, cela aurait pour conséquence soit uneSuccess("Test1")
ou unFailure(Exception("Test2"))
. C'est un peu différent de "Test1" et "Test2", mais je trouve cette syntaxe pour être plus utile.Vous l'utiliser comme ceci:
Bien sûr, j'ai pensé à une solution moi-même. Peut-être il y a de mieux, de plus idiomatiques, des solutions?
recover
ici est d'accord. Si vous voulez récupérer de n'appliquer le prédicat de filtre en fonction de l'exception, alors vous devez changer lecase _
àcase ex:NoSuchElementException
oùNoSuchElementException
vient dejava.util
.J'ai aimé @pkinsky l'idée, et fait un peu d'amélioration. J'ai laissé tomber le code pour créer
Exception
objet comme ceci:shouldTrue
fonction est implémentée à l'aide de lihaoyi de code source bibliothèque:Ensuite, il génère automatiquement des plus significatives de message d'exception: