.zip Scala中的三个期货

时间:2017-05-05 12:23:05

标签: scala

我需要下面的result变量来包含Future[(String,String,String)],其中包含期货f1f2f3的结果,而不是我' m获得Future[((String, String), String)]。我需要三个期货并行运行。如何使这项工作?

  def futureA = Future { "A" }
  def futureB = Future { "B" }
  def futureC = Future { "C" }

  def futureFunc = {

       val cond1 = 1
       val cond2 = 0

       val f1 = if (cond1 > 0) 
             futureA
       else 
             Future {""} 

       val f2 = if (cond2 > 0) 
             futureB
       else 
             Future {""} 

       val f3 = futureC

       val fx = f1.zip(f2)

       val result = fx.zip(f3)

  }

2 个答案:

答案 0 :(得分:1)

如果您事先创建了未来,可以将它们组合起来以便理解它们并且它们将并行运行:

for {
  a <- f1
  b <- f2
  c <- f3
} yield (a, b, c)

res0: scala.concurrent.Future[(String, String, String)]

答案 1 :(得分:0)

我尝试创建更多解决方案,结果如下:

  def futureFunc = {

    val cond1 = 1
    val cond2 = 0

    val f1 = if (cond1 > 0)
      futureA
    else
      Future {""}

    val f2 = if (cond2 > 0)
      futureB
    else
      Future {""}

    val f3 = futureC
//#1
    Future.sequence(List(f1, f2, f3)).map {
      case List(a, b, c) => (a, b, c)
    }
//#2
    for{
      f11 <- f1
      f22 <- f2
      f33 <- f3
    } yield (f11, f22, f33)
//#3
    f1.zip(f2).zip(f3).map{
      case ((f11,f22),f33) => (f11,f22,f33)
    }

  }

第一个使用Future序列,用于创建Future [List []],然后将此列表映射为元组(因为类型安全,我们没有用于元组列表的方法)。

其次是Sascha所描述的用于理解的用法,因为你可能知道它是地图和平面图的语法糖,它更适合用于期货。

最后一个正在使用拉链,如你所愿,但你仍然需要映射最后的未来以获得你想要的元组。

所有操作都是非阻塞的,但是对于所有操作,您需要准确了解将要使用的期货。您可以使用其他库来进行元组列表,然后使用第一个解决方案来获取未知的未知金额。为了便于阅读,我认为理解是最好的。