在下面的代码中,x
是 Future[Future[Int]]
类型,我需要将其展平为 Future[Int]
.这怎么可能?
def times(a:Int, b:Int) = Future { a * b }
val x = for {
x1 <- Future { 1 }
x2 <- Future { 2 }
} yield {
val future = times(x1,x2)
future.map { result => result * 2 }
}
最佳答案
使用相同的理解。作为times
返回 Future
接受输入x1
和 x2
.您可以使用相同的 for-comprehension 来提取 future 的值(value)。
def times(a:Int, b:Int) = Future { a * b }
val x = for {
x1 <- Future { 1 }
x2 <- Future { 2 }
result <- times(x1,x2)
} yield (result * 2)
记住 for-comprehension 是 flatMap
的语法糖s 和一个决赛 map
整个事情可以写成
Future { 1 }.flatMap { x1 => Future { 2 }.flatMap { x2 => times(x1, x2).map { result => result * 2 }}}
警告:当您创建内联数据独立 future 时(在 for-comprehension 内或在 flatMap 内)。这些 future 将按顺序执行。
因为第一个和第二个 future 是数据独立的。如果您在 for-comprehension 或 flatMap 之外创建它们,则它们可以并行执行。
平 future
使用 flatMap
转换 Future[Future[Int]]
进入Future[Int]
def times(a:Int, b:Int) = Future { a * b }
val x = (for {
x1 <- Future { 1 }
x2 <- Future { 2 }
} yield {
val future = times(x1,x2)
future.map { result => result * 2 }
}).flatMap(identity) // <--- notice flatMap here around the for-comprehension
为了清楚起见,上面的代码可以重写为
def times(a:Int, b:Int) = Future { a * b }
val x = for {
x1 <- Future { 1 }
x2 <- Future { 2 }
} yield times(x1,x2).map(_ * 2)
val finalResult = x.flatMap(identity)
scala> :paste
// Entering paste mode (ctrl-D to finish)
def times(a:Int, b:Int) = Future { a * b }
val x = for {
x1 <- Future { 1 }
x2 <- Future { 2 }
} yield times(x1,x2).map(_ * 2)
val finalResult = x.flatMap(x => x)
// Exiting paste mode, now interpreting.
scala> finalResult
res0: scala.concurrent.Future[Int] = Future(Success(4))
https://stackoverflow.com/questions/49245878/