nicht kompilieren können Sie einen for comprehension verwenden. Im Beispiel:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Stuff extends App {
val result = for {
f1 <- Future { 10 + 1 }
f2 <- Future { f1 + 2 }
} yield f2
result.onComplete(println)
}
Wo Ergebnis wird 13.
Jede Klasse, die eine richtige map
und flatMap
Funktion implementiert, kann in einem for
auf diese Weise verwendet werden.
Wenn Sie keine andere Abhängigkeit dagegen haben, können Sie auch eine Bibliothek wie scalaz verwenden und explizit monadischen Bindung verwenden, um Dinge zu abflachen (EDIT einige Option Typen codiert einen Kommentar unten zu adressieren):
import scalaz._
import Scalaz._
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.util.{Success,Failure}
object BindEx extends App {
def f1(i: String): Future[Int] = Future { i.length }
def f2(i: Int): Future[Option[Double]] = Future { Some(i/Math.PI) }
def f3(i: Option[Double]): Future[Option[Double]] = Future {
i match {
case Some(v) => Some(Math.round(v))
case _ => None
}
}
val result =
Monad[Future].point("Starting Point") >>=
f1 >>=
f2 >>=
f3
result.onComplete { x =>
x match {
case Success(value) => println("Success " + value)
case Failure(ex) => println(ex)
}
}
Await.result(result, 1 seconds)
}
und schließlich, wenn Sie nur parallele Operationen, die Sie binden möchten schließlich gelungen ist, die unabhängig sind, können Sie scalaz applicative Builder verwenden:
val result = (
Future { 10 + 10 } |@|
Future { 20 - 3 } |@|
Future { Math.PI * 15 }
) { _ + _/_}
println(Await.result(result, 1 seconds))
Damit können alle drei Futures abgeschlossen ist, dann Block gelten für die 3 Argumente.
, wenn Sie mit einem Beispiel kommen die tatsächlich kompiliert, wenn man sich in eine IDE Pasten, könnte es einfacher seine Verbesserung vorzuschlagen ... –
@KimStebel veränderte einfach den Code so ist es universeller –
Sie sollten vermeiden, Future's an erster Stelle zu stapeln, indem Sie 'Future.traverse' oder' Future.sequence' verwenden. – Dimitri