2017-06-15 44 views
0

我有未來[MyType的],我需要的MyType的值傳遞給它返回SEQ方法[未來[MyType的],的問題,所以基本簽名是:Scala的未來[的myType]至MYTYPE

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

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

我想要的值傳遞給的getValue。我想是這樣的:

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

我想b可能是Seq[Future[MyType]]

的,但是,它顯然沒有做過v是未來型[MyType的],並只的MyType的getValue需要的參數。什麼是可能的解決方案?

+0

你有'序列[未來[的MyType]'這意味着你有多個'未來[的MyType]'。你把哪一個傳遞給'getValue()'有什麼關係?序列中的第一個?首先用「成功」完成? – jwvh

+0

jwvh,我需要通過所有的成功 – User2403

回答

3

你可以這樣做:

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

這會給你一個Seq[Future[Seq[Future[MyType]]]]。這很醜陋。有三種工具可以使這一點變得更好。

  1. Future.sequence需要Seq[Future[A]],並給你一個Future[Seq[A]]。輸出的未來將等待所有的輸入期貨完成,然後再給出結果。這可能並不總是你想要的。
  2. fut.flatMap需要函數計算Future作爲結果,但不會返回嵌套的Future,就像.map會發生的那樣。
  3. 你可以叫.flatten上一個Seq[Seq[A]]獲得Seq[A]

把所有這些組合起來,你可以這樣做:

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個元素來完成。所以,如果你將它轉換爲'序列[未來[的MyType]',什麼應該是該對象的'.size'的結果呢?當然,你可以只是等待未來回答之前完成,但當時爲什麼不這樣做呢,只是得到一個簡單的'序列[MyType的]'? –

相關問題