我遇到了这个问题,我在Scala中使用了理解功能来链接一些Future,然后获取具有其中一些值的类的实例。问题在于我将值分配给的val是Future [MyClass]类型而不是MyClass类型,而且我似乎无法弄清楚为什么。
代码是这样的:
val future = someService.someFutureReturningMethod()
val x = for{
a <- future
b <- someOtherService.someOtherFutureMethod(a)
} yield {
MyClass(b.sth, b.sthElse)
}
这里的问题是x最终是Future [MyClass]类型,而不是MyClass类型,我似乎无法弄清楚为什么。
答案 0 :(得分:4)
这种行为是正确的,您可以将其用于理解,因为Future [T]可以理解flatMap和map方法。
以下代码
val futureA = Future.successful(1)
val futureB = Future.successful(2)
val futureC = Future.successful(3)
val x1 = for {
a <- futureA
b <- futureB
c <- futureC
} yield {
a + b + c
}
它被编译为
val x2 = futureA.flatMap {
a => futureB.flatMap {
b => futureC.map {
c => a + b + c
}
}
}
对Future.flatMap或Future.map的调用是Future。 (与Option,Try,Either等相同)
如果您想要结果,则需要等待它。
Await.result(x, Duration(10, TimeUnit.SECONDS))