あなたの問題を提示する方法は、本当にスケーラが意図している機能的なパラダイムではありません。
あなたが望むように見えるのは、非同期計算のリストを作成し、それぞれの終わりに何かを実行することです。これは、map
とflatMap
のメソッドを実装するのが簡単な継続をFuture
にすると、非常に簡単です。
val fa: Future[Int] = Future { 1 }
// will apply the function to the result when it becomes available
val fb: Future[Int] = fa.map(a => a + 1)
// will start the asynchronous computation using the result when it will become available
val fc: Future[Int] = fa.flatMap(a => Future { a + 2 })
あなたはこのすべてを持っていたら、あなたのFuture
完了(成功した)の各とき、あなたは簡単に何かを行うことができます:
ここ
val myFutures: List[Future[Int]] = ???
myFutures.map(futInt => futInt.map(int => int + 2))
が、私は別の非同期から取得した各値に2を追加しますList
の計算。
またFuture.sequence
を使用して完了するために、リスト内のすべてのFuture
のを待つことを選択することができます。
val myFutureList: Future[List[Int]] = Future.sequence(myFutures)
はもう一度、あなたは内部Future
秒のときに、各解決されますFuture
を取得入力リストが正常に解決されたか、Future
のいずれかが失敗したときに失敗します。この新しいFuture
にmap
またはflatMap
を使用して、すべての計算値を一度に使用することができます。あなたと何かをする値を持つことができるように、私は、本当の機能ではなく、(Unit
を返す)手続きを持つ推薦、もちろん
val l = 1 to 10
val processings: Seq[Future[Unit]] = l.map {n =>
Future(println(s"processing $n")).map {_ =>
println(s"finished processing $n")
}
}
val processingOver: Future[Unit] =
Future.sequence(processings).map { (lu: Seq[Unit]) =>
println(s"Finished processing ${lu.size} elements")
}
:だからここ
は、私はあなたが提案したコードを記述します方法です。私はprintln
を使用してあなたと同じ出力を生成するコードを持っていました(もう何も変わっていないので、少し異なる意味を持つプリントを除いて)。
変更可能にする必要がありますか?将来の未来の理由 – mfirry
@mfirryリストが空のとき(つまり、すべての要素が消費され、アクションが完了したとき)に、何か別のやり方をする必要があります。たとえば、処理中の他の要素が存在する可能性があるため、最後の項目が処理中であることを確認することはできません。 「未来の未来」の部分は、実際のコードの構造を模倣することです。そのような理由があります。ここで少し簡素化しています。 –
しかし、本当にバッファを変更する必要がありますか? – mfirry