Ich habe eine Methode, die Future [Try [Option [Int]]] zurückgibt. Ich möchte den Wert von Int für weitere Berechnungen extrahieren. Irgendeine Idee, wie man es verarbeitet?Prozess Zukunft [Try [Option]] in Scala
Antwort
Gerade map
die Zukunft und Nutzung Match Fall die verschiedenen Fälle zu behandeln:
val result: Future[Try[Option[Int]]] = ???
result.map {
case Success(Some(r)) =>
println(s"Success. Result: $r")
//Further computation here
case Success(None) => //Success with None
case Failure(ex) => //Failed Try
}
Converting Future[Try[Option[Int]]]
zu Future[Int]
Ein hacky Weg ist, die ungünstigen Ergebnisse in fehlgeschlagen Zukunft zu konvertieren und flatMapping über .
Konvertieren Sie Versuche fehlgeschlagen in zukünftige Fehler unter Beibehaltung der Informationen, dass die Ausnahme von Try stammte, und konvertieren Sie keine zu NoneFound-Ausnahme.
val f: Future[Try[Option[Int]]] = ???
case class TryException(ex: Throwable) extends Exception(ex.getMessage)
case object NoneFound extends Exception("None found")
val result: Future[Int] = f.flatMap {
case Success(Some(value)) => Future.successful(value)
case Success(None) => Future.failed(NoneFound)
case Failure(th) => Future.failed(TryException(th))
}
result.map { extractedValue =>
processTheExtractedValue(extractedValue)
}.recover {
case NoneFound => "None case"
case TryException(th) => "try failures"
case th => "future failures"
}
Jetzt wissen Sie in jedem Fall, woher die Ausnahme stammt. Im Falle einer NoneFound-Ausnahme wissen Sie, dass Future und Try erfolgreich sind, aber die Option ist keine. Auf diese Weise gehen Informationen nicht verloren und die verschachtelte Struktur wird auf Future[Int]
reduziert.
Jetzt Ergebnis wäre Future[Int]
. Verwenden Sie einfach map, flatMap, recover und recoverWith, um weitere Aktionen zu erstellen.
future.map(_.map(_.map(i => doSomethingWith(i))))
Wenn Sie cats verwenden Sie können Spaß machen (für bestimmte Definitionen Spaß) Dinge wie:
import scala.concurrent._
import scala.util._
import scala.concurrent.ExecutionContext.Implicits.global
import cats.Functor
import cats.instances.option._
import cats.implicits._
val x = Future { Try { Some(1) } } // your type
Functor[Future].compose[Try].compose[Option].map(x)(_ + 2)
Dies wird vorgeschlagen, nur wenn Sie mit Katzen oder scalaz bereits vertraut sind. Ansonsten ist es toll, mit einer der anderen gültigen Antworten hier zu gehen (ich mag besonders die Map-Map-Map).
Wenn Sie wirklich besorgt über die Extraktion sehen Sie dies, sonst gehen Sie durch die Antwort von @pamu, um zu sehen, wie Sie Ihre Zukunft tatsächlich verwenden.
Angenommen, Ihr zukünftiger Wert ist result
.
Await.ready(result, 10.seconds).value.get.map { i => i.get}.get
Offensichtlich wird nicht durch Ihren Ausfall und keine Fälle erhalten und Ausnahmen auslösen würde und Await wird nicht empfohlen.
Also, wenn Sie Ausfall und keinen Fall behandeln wollen ->
val extractedValue = Await.ready(f, 10.seconds).value.get match {
case Success(i) => i match {
case Some(value) => value
case None => println("Handling None here")
}
case Failure(i) => println("Handling Failure here")
}
- 1. Auspacken Zukunft [Option [MyType]] in Scala
- 2. scala gibt eine Zukunft zurück [Option [user]]
- 3. Scala Zukunft [Option [T]] Un Verpackung
- 4. Try/Option mit null
- 5. Convert scala Zukunft java Zukunft
- 6. Abflachungsliste + Zukunft für Scala
- 7. Scala Zukunft [myType] MyType
- 8. Wie viele Schichten der Zukunft Option Zukunft in der Antwort
- 9. Zukunft, die in Scala nicht fehlschlagen kann
- 10. scala Pattern-Matching auf (Try, Try)
- 11. Flatten Scala Try
- 12. Rückgabewert aus einer Scala-Zukunft
- 13. Scala Zukunft mapTo nicht ClassTag
- 14. Scala Zukunft mit akka-http
- 15. Fehlerbehandlung Scala: Zukunft für Verständnis
- 16. So entpacken Sie die Option in Zukunft?
- 17. Scala Karte über eine Zukunft
- 18. Wie ein Try [Option [T]]
- 19. Unähnliches Scala-Buch in naher Zukunft
- 20. Rückkehr der Zukunft der Zukunft im Spiel für Scala
- 21. Was sind Vorteile einer Twitter-Zukunft gegenüber einer Scala-Zukunft?
- 22. Scala Try toOption Methode gibt einige (null)
- 23. Throttling Scala Zukunft blockiert, wenn onComplete
- 24. Scala Try und verschiedene Fehlerfälle
- 25. Wie sauber zu Funktionseingänge validieren und eine Zukunft in Scala
- 26. Konvertieren einer Bedingung in Option in Scala
- 27. Scala Try/Catch-Block in Scala schlägt fehl Exception
- 28. IO und Zukunft [Option] Monade Transformatoren
- 29. So behandeln Sie eine Ausnahme, die in Zukunft in scala
- 30. Convert scala 2.10 Zukunft zu scalaz.concurrent.Future // Aufgabe
versuchen zu verstehen, warum Sie eine Zukunft haben [Versuchen [Option [Int]]]. Wenn Sie sowohl Future a Try als auch Option auswählen, können Sie versuchen, Ihr Ergebnis, das aus einer Methodenkomposition in einer einzigen Zukunft stammt, zuzuordnen. –
Ich stimme @FabioFumarola zu. Es ist sehr bedauerlich, mit dieser Art von Typ umgehen zu müssen. – mfirry
Die richtige Antwort hängt weitgehend davon ab, wie Sie die Fehlerfälle für Future, Try und None behandeln wollen. Bitte fügen Sie weitere Details dazu hinzu. – nmat