1
votes

Scala: meilleure façon de gérer Future.Filter.exists sans conditions spécifiques

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( _ => {...})


1 commentaires

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.


4 Réponses :


0
votes

Vous pouvez remplacer:

tryThis.filter(_.isDefined)

par:

tryThis.filter(_.exists(_ => true))


1 commentaires

Merci pour _.isDefined @ senjin.hajrulahovic, comme je suis stupide d'écrire ceci _.exists (_ => true)



0
votes
  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

1 commentaires

foreach ou andThen semble plus approprié s'il n'y a pas de valeur de retour et seulement un effet secondaire.



2
votes

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


0 commentaires

2
votes
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…) }

2 commentaires

Vous devriez probablement expliquer que vos deux solutions produisent des résultats différents.


@Tim Good call — modifié.