Scala的理解优化(身份图)

时间:2013-01-25 14:47:43

标签: scala for-comprehension

如何避免Scala map(identity)中的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 - 理解转化为类似

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

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

P.S。我知道在这个特定的例子中,事情可以得到改善。我想知道一般情况,例如Future { value * 2}是函数f(value)的函数f,返回未来。

1 个答案:

答案 0 :(得分:2)

an anti-pattern创建自己的未来只是为了在一个应用程序中运行。你可以改为:

  • future.map()最后以onSuccess获得结果(这是最简单的模型)
  • 如果你已经完成了理解,yield Future { value * 2 }然后得到你的结果......(虽然这并不能解决虚假的未来创造问题)
  • transform你的未来,然后得到你的结果......
  • collect关于您的未来,然后map(f)关于结果

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