2017-06-16 70 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可能會或可能不打印。

希望這會有所幫助。