2017-06-16 131 views
1

在下面的示例中,预期的行为是什么?未来的斯卡拉地图

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

是的,这就是链接事物的整个映射点,给你一个计算链接的新未来。 – flavian

+1

如果您在映射函数的结果被赋予onComplete处理函数之前是否总是执行映射函数,那么是的。 – rompetroll

+0

酷!那正是我期待的 – sparkr

回答

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可能会或可能不打印。

希望这会有所帮助。