scala - 扁平化 future 内部 yield

在下面的代码中,xFuture[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接受输入x1x2 .您可以使用相同的 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 REPL

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/

相关文章:

angular - 为什么在导航路线时 Angular canActivate 函数保护执行两次

antd - 为选择的多个组件设置默认初始值

json - 如何从 Oracle JSON 列获取数组索引?

ms-access - 从 VBA Access 中的函数返回数据类型时收到 'Invalid Us

php - Laravel 存储库和多个相关模型

python - 从python字符串中删除大写字母

vuejs2 - 在 vue.js 中捕获 API 请求中的错误

apache-kafka - 一对多KStream-KTable连接

c# - 如何确定在 Simple Injector 中使用哪种生活方式

reactjs - 我如何将两个 Prop 从 jsx 传递到 scss