2015-12-31 104 views
0

我試圖用理解來執行系列期貨清單。一個未來的輸出成爲未來未來的輸入。以下是示例代碼。For comprehension Dynamic List of Futures:Scala

for { 
     x <- plugins(0).execute(input) 
     y <- plugins(1).execute(x) 
     z <- plugins(2).excute(y) 
    } yield z 

上面的代碼更像瀑布,每個插件(i)在某些輸入上執行,並將輸出傳遞給下一個插件。最後一個插件的輸出是最終輸出。 插件是一個Seq插件對象。 execute方法返回一個Future。我想讓上面的代碼更通用,其中插件的插件數量是動態的。我如何去實現它。

回答

3
plugins.foldLeft(Future.successful(input)) { (resultFuture, plugin) =>  
    resultFuture.flatMap(plugin.execute(_)) 
} 

有兩個工具在這裏使用:foldLeftflatMap

在這些鏈接看看,看看你是否瞭解這些功能做

Future.successful只是包裝輸入到未來,所以我們可以像對待所有其他中間結果一樣對待它。 Underscore是lambda函數參數的快捷方式。編寫該作品的另一種方法是:resultFuture.flatMap { result => plugin.execute(result) }

+0

你能解釋一下上面的代碼是如何工作的,我仍然試圖找到scala的方法。謝謝。 – konquestor

+1

你不明白什麼? 這裏有兩個工具在使用:'foldLeft' http://www.scala-lang.org/api/2.11.4/index.html#[email protected][B](z:B )(f:(B,A)=> B):B和'flatMap' http://www.scala-lang.org/api/2.11.4/index.html#[email protected][S ](F:T => scala.concurrent.Future [S])(implicitexecutor:scala.concurrent.ExecutionContext):scala.concurrent.Future [S]。看看這些鏈接,看看你是否明白這些功能的作用。 – Dima

+0

爲什麼我們需要Future.successful,什麼是下劃線? – konquestor