2017-02-16 39 views
1

我有一些lambda表達式如下:序列的功能應用

val foo : (Int => Option[String]) = (x: Int) => Some("foo") 
val bar : (Int => Option[String]) = (x: Int) => Some("bar") 

Seq(foo,bar).flatMap(_ (2)) 

,並評估如我所料:

res0: Seq[String] = List(foo, bar) 

現在,我將改變lambda表達式爲使他們採取的INT和退回玩具未來計算:

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

val foo1 : (Int => Future[Option[String]]) = (x: Int) => Future successful Some("foo") 
val bar1: (Int => Future[Option[String]]) = (x: Int) => Future successful Some("bar") 

我想得到和以前一樣的結果,即List("foo", "bar")但我不知道如何實現它。我想我需要使用Monad Transformers,但不完全確定。

+0

可能重複[使用哪個Monad Transformer?](http://stackoverflow.com/questions/42290243/which-monad-transformer-to-use) –

回答

2

您可以使用Future.sequence的結果轉換爲Future[List],然後壓平:

Future.sequence(Seq(foo1,bar1).map(_ (2))).map(_.flatten) 

這將返回一個Future[List[String]],那麼你就可以處理Future你似乎契合。