次のように動作し、外観が機能しているようです。私はこれが実際にどのように実行されるか、またはフードの下で動作するかについての知識は限られています。
これは容易にハードコード化された4パラメータが渡されDEFに平手打ちすることができます。
私は真ん中の将来の評価がいずれかの方法を発生する必要があるため、わずか4が要求されたにもかかわらず、5つの要素を返す必要があることを考え出しました。余分な要素を削除するのは簡単です。
val f = Iterable(Future(Seq(1,2,3)), Future(Seq(4,5)), Future(Seq(6,7,8)))
val output = f.foldLeft(Future(Seq.empty[Int])){(previous, next) =>
previous.flatMap{pSeq =>
if(pSeq.length >= 4) {
Future(pSeq)
} else {
next.map(nSeq => pSeq ++ nSeq)
}
}
}
println(Await.result(output, Duration.Inf)) //List(1,2,3,4,5)
私は好きではないビットはちょうど一貫した型を維持するために、今後のPSEQをラップしています。
EDIT:ヴィクトルの答えにジャスト応答(私は十分に高くないので、担当者はコメントできないと、それは少し私の答えに値を追加します)。ヴィクトルの答えは、それを読みやすくであっても
は、彼らが必要とされていない場合でも、完了するために、すべての先物のを待たなければなりません。例えば
以下と鉱山でFを置き換える:
val f = Iterable(Future(Seq(1,2,3)), Future(Seq(4,5)), Future(throw new Exception))
それはまだ、将来[反復処理可能[] int型のIterable [フューチャー[]]をオンヴィクトルの呼び出しFuture.sequenceに動作します]ので、すべてを完了する必要があります。
注すでに 'Future'sの' Iterable'を持っている場合、彼らはすでに「開始」していること。 –
@EndeNeuああ、これは非常に貴重なコメントです!だから、実際には、もうそれらを「キャンセル」する方法はありませんか? –
しかし、本当に 'Iterable'で、' Seq'ではなく、実際に開始されるのですか?私はそれらを "オンデマンド"に初期化しますが、これは助けてはなりませんか? –