斯卡拉模式:对于产生未来的理解[A]

时间:2016-11-14 22:57:53

标签: scala future for-comprehension

Scala用于处理场景的模式是什么:

你有一堆未来(它们可以是任何东西,但为了示例......)

/

你有一些函数可以返回未来

val aF = Future { true }
val bF = Future { Option(3) }
val cF = Future { myObject }

我想做类似的事情:

def fooF: Future[SomeObject]

我想返回for { a <- aF b <- bF c <- cF } yield { if (a) { // do stuff with b & c fooF } else { Future.successful(SomeObject) } } 的值,但我在yield语句中调用fooF,我会得到Future[SomeObject]

2 个答案:

答案 0 :(得分:2)

这是另一种解决方案:

def doStuffWith(a: A, b: B, c: C): Future[SomeObject] = if (a) {
  // do stuff with b & c
  fooF
} else Future.successful(SomeObject)

for {
  a <- aF
  b <- bF
  c <- cF
  d <- doStuffWith(a, b, c)
} yield d

正如在@laughedelic的回答中所讨论的,这是一个主观的观点,但我相信这种方式更具可读性和可维护性(例如,取出函数总是进行单元测试)。

答案 1 :(得分:-2)

  • 在Scala 2.12 Future中有一个flatten方法:

      

    创建一个平坦嵌套级别的新未来,此方法相当于flatMap(标识)。

    所以你可以写for { ... } yield { ... } flatten

  • 在Scala&lt; 2.12中,您可以使用flatMap(identity)(如上所述)实现相同的目标

另一种解决方案是使用flatMap而不是for-comprehension:

aF.flatMap { a =>
  if (a) {
    (bF zip cF).flatMap { (b, c) =>
      // do stuff with b & c
      fooF
    }
  } else 
    Future.successful(SomeObject)
  }
}