2017-06-16 5 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ハンドラに渡される前にマッピング関数が常に実行されるかどうかを確認する場合は、yesを指定します。 – 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は印刷される場合とされない場合があります。

これが役に立ちます。