Scala收益回报未来

时间:2018-09-18 12:14:34

标签: scala

我遇到了这个问题,我在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类型,我似乎无法弄清楚为什么。

1 个答案:

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