在以下示例中,预期的行为是什么?
import scala.concurrent.ExecutionContext.Implicits.global
val someFuture = Future { 1+1 }.map(elem => {
println("mapping immediately")
elem.toString
})
someFuture.onComplete {
case scala.util.Success(value) => println(s"Got the callback = $value")
case Failure(e) => e.printStackTrace()
}
是否始终保证以下输出?
mapping immediately
Got the callback = 2
答案 0 :(得分:4)
取决于。
val someFuture = Future { 1+1 }.map(elem => {
println("mapping immediately")
elem.toString
})
someFuture
将被急切执行,println
将被执行。
someFuture.onComplete {
case scala.util.Success(value) => println(s"Got the callback = $value")
case Failure(e) => e.printStackTrace()
}
onComplete
是Future
的事件监听器。仅当未来通过例外或值完成时才会调用此方法来应用提供的函数。
因此,它将始终在执行someFuture
。
假设someFuture
不会失败,订单
`mapping immediately
Got the callback = 2`
有保证。
出于任何原因,如果抛出异常,那么结果将会改变。在这种情况下,Got the callback = 2
将不打印,mapping immediately
可能打印也可能不打印。
希望这有帮助。