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]
答案 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)
}
}