2016-06-01 9 views
1

時々、値をFutureに上げる必要があります。ここで将来の価値を高める方法

はそれを行うには2通りの方法がある:

  • は解決策1:def lift[T](t: T) : Future[T] = Future(t)

  • 解決方法2:def lift[T](t: T) : Future[T] = Future.successful(t)

私の知る限りでは、溶液2はあると思われますそれはスレッド機構を避けてより性能があり、たぶんコンテキスト切り替えです。

別の長所と短所はありますか? 別の解決策がありますか?

答えて

5

未来へとラップする必要がある値がすでに計算されている場合(つまり、t: Tが名前に渡されていないことが暗示されているため、既にわかっています)、オプション2がその方法です。

オプション1には、パフォーマンスを実際に低下させる可能性があるコンテキストスイッチが含まれます。

ただし、安価なメモリ内の計算(IOなしのパラメータ検証など)を行う必要があり、その結果としてFutureが必要になることがあります。 Future.successful(throw new Exception)はFutureを生成しませんが、例外がスローされます。これは予期しないことがあります.Futuresを識別可能な実行フローで言語構造として扱う傾向があり、非同期コードでは一般的に同期例外を処理しません。このような状況から自分を守るために、別のオプションを検討してください:それは例外を変換し、試しに包まれるまで、それが発生した場合

def lift[T](t: => T): Future[T] = Future.fromTry(Try(t)) 

名前による引数はそれを投げるのではなくFuture.failedに、計算を延期します。