2017-06-15 9 views
0

をMYTYPEする[未来【がMyType]、問題のように基本的な署名がある:スカラ将来[MYTYPE]私は将来【がMyType]があると私は、配列を返す方法がMyTypeの値を渡す必要が

val a: Seq[Future[MyType]] = ... 

getValue(t: MyType): Seq[Future[MyType]] = {...} 

getValueにaの値を渡したいと思います。 [がMyType]タイプの未来であるとのgetValueパラメータとしてのみがMyTypeを必要と私はそれが明らかにVとして働いていなかった、bはSeq[Future[MyType]]タイプ

のようにしたいが、

val b:Seq[Future[MyType]] = a.map{v => getValue(v)} 

:私のようなものを試してみました。可能な解決策は何でしょうか?

あなたが行うことができます
+0

あなたは 'Seq [Future [MyType]]を持っています。これはあなたが複数の' Future [MyType] 'を持つことを意味します。 'getValue()'に渡すために引き出したものはどれですか?シーケンスの最初の?最初に「成功」​​を完成させる? – jwvh

+0

jwvh、成功のすべてを渡す必要があります – User2403

答えて

3

val b = a.map(_.map(getValue(_))) 

これはあなたにSeq[Future[Seq[Future[MyType]]]]を与えるだろう。それはかなり醜いです。それをより良くする3つのツールがあります。

  1. Future.sequenceSeq[Future[A]]を取り、あなたにFuture[Seq[A]]を与えます。出力先は、すべての入力先が完了してから結果が得られるまで待機します。これは必ずしもあなたが望むものではないかもしれません。
  2. fut.flatMapは、結果としてFutureを計算する関数をとりますが、.mapで起こるように、入れ子にされたFutureを返しません。
  3. あなたはSeq[A]

はすべて一緒にこれを置く取得するSeq[Seq[A]].flattenを呼び出すことができ、あなたのような何かができる:「コンテナ」タイプを扱うとき、

より一般的に
val b: Seq[Future[Seq[MyType]] = a.map(_.flatMap(x => Future.sequence(getValue(x)))) 
val c: Future[Seq[MyType]] = Future.sequence(b).map(_.flatten) 

、あなたmapflatMapの組み合わせを使用して、内側の型を取得して渡します。一般的なコンテナには、オーダーをフラット化またはスワップする方法もあります。 A[A[X]] => A[X]またはA[B[X]] => B[A[X]]

+0

Joe Kさん、ありがとうございました。あなたがしたことを理解していますが、c:Future [Seq [MyType]]を 'c:Seq [Future [MyType ]] '?? – User2403

+0

おそらくそうではありません。 'Future [Seq [MyType]]は最終的には空のSeqか100要素のもので終わることができます。だから、Seq [Future [MyType]]に変換すれば、そのオブジェクトの '.size'の結果はどうでしょうか?確かに、答える前に未来が完了するのを待つことができますが、とにかくそれをやっていないだけで、単純なSeq [MyType]を得るのはなぜですか? –

関連する問題