gpt4 book ai didi

scala - 扁平化 future 内部 yield

转载 作者:行者123 更新时间:2023-12-05 09:16:56 27 4
gpt4 key购买 nike

在下面的代码中,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))

关于scala - 扁平化 future 内部 yield ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49245878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com