如何避免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
,返回未来。
答案 0 :(得分:2)
an anti-pattern创建自己的未来只是为了在一个应用程序中运行。你可以改为:
future.map()
最后以onSuccess
获得结果(这是最简单的模型)yield Future { value * 2 }
然后得到你的结果......(虽然这并不能解决虚假的未来创造问题)transform
你的未来,然后得到你的结果...... collect
关于您的未来,然后map(f)
关于结果根据您的上下文和计算模型,这些解决方案中的一个或另一个可能更合适:您似乎正在呈现一般情况的特定情况,但不清楚一般情况是否应涉及迭代Futures,链接转换一个未来,或完全不同的东西。