斯卡拉地图未来

时间:2017-06-16 08:35:40

标签: scala future

在以下示例中,预期的行为是什么?

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

1 个答案:

答案 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()
}

onCompleteFuture的事件监听器。仅当未来通过例外或值完成时才会调用此方法来应用提供的函数。

因此,它将始终在执行someFuture

后执行

假设someFuture不会失败,订单

`mapping immediately
 Got the callback = 2`

有保证。

出于任何原因,如果抛出异常,那么结果将会改变。在这种情况下,Got the callback = 2打印,mapping immediately可能打印也可能不打印。

希望这有帮助。