Scala Future附带副作用最佳实践



如果我希望我的Scala Future返回一个值,可以通过Await result/ready来保证执行,例如-

def longCalculation: Int = {
Thread.sleep(2000)
42
}
implicit val executionContext = scala.concurrent.ExecutionContext.global
val aFuture: Future[Int] = Future {  
longCalculation
//        throw new ArrayIndexOutOfBoundsException // non-fatal exception
//        throw new StackOverflowError() // fatal exception
}

评估返回具体价值的未来-

val ready_aFuture_1: Future[Int] = Await.ready(aFutureTest, Duration.Inf)
val ready_aFuture_2: Option[Try[Int]] = ready_aFuture_1.value
val ready_aFuture_3: Try[Int] = ready_aFuture_2.get // will never be None, Option is unnecessary.
val ready_aFuture_4: String = ready_aFuture_3 match {
case Success(t) => t.toString
case Failure(e) => e.toString
}
println(ready_aFuture_4)

如果我想在未来操纵副作用,我能找到的唯一能保证执行的方法就是

val f: Future[Unit] = aFuture.map{ v =>
println(s"the result of aFuture map is: $v")
}
Await.result(f, Duration.Inf)

但这很难看,因为我用.map表示";副作用";并且因为我们需要保留和使用类型CCD_ 1。是否有任何其他方法来保证未来的处理;副作用;?

您可能想要使用andThen。scala医生说:

将副作用函数应用于此future的结果,并返回带有此future结果的新future。

因此,例如,您可以编写:

val f: Future[Int] = aFuture.andThen { v =>
println(s"the result of aFuture map is: $v")
}
Await.result(f, Duration.Inf)

最新更新