1

我怎样才能避免map(identity)在 Scala 中的for理解?

例如,考虑:

import scala.concurrent._
import scala.concurrent.duration._

object Test extends App {
  implicit val executorContext = ExecutionContext.global
  val future = Future.successful { 1 }
  val result = for (
    value <- future;
    b <- Future { value * 2 }
  ) yield b
  println(Await.result(result, 60 seconds))
}

IIUC,for-comprehension 转换为类似

future.flatMap(value => Future { value * 2 }).map(identity)

我可以map(identity)以某种方式避免尾随吗?或者Scala是否/可以/可以优化它?(我想它不能,因为不清楚是否map有任何副作用,对吧?)

PS我知道在这个特定的例子中,事情可以改进。我想知道一般情况,例如Future { value * 2}调用返回未来f(value)的函数。f

4

1 回答 1

2

创建自己的 Future 只是为了在其中进行应用操作是一种反模式。您可以改为:

  • future.map()最后得到你的结果onSuccess(这是最简单的模型)
  • 如果你在理解上死心塌地,yield Future { value * 2 }然后得到你的结果......(虽然这并不能解决虚假的未来创造问题)
  • transform你的未来,然后得到你的结果......
  • collect关于你的未来,然后map(f)是结果

根据您的上下文和计算模型,这些解决方案中的一个或另一个可能更合适:您似乎在呈现一般情况的特定情况,但目前尚不清楚一般情况是否应该涉及迭代 Futures,在一个 Future 中链接转换,或完全不同的东西。

于 2013-01-25T15:15:54.590 回答