如何在Scala for-comprehensions中避免map(identity)?
例如,考虑以下内容:
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是否有副作用,对吧?)
附注:我知道在这个特殊的例子中,事情是可以改进的。我想知道一般的情况,例如Future { value * 2}是对返回未来的函数f的调用f(value)。
发布于 2013-01-25 23:15:55
创建自己的未来就是an anti-pattern,只是为了在其中进行应用操作。相反,您可以:
future.map(),最后用onSuccess (这是最简单的模型)得到你的结果yield Future { value * 2 },然后得到你的结果……(虽然这并不能解决虚假的未来创造,然后在你的未来上获得你的结果,然后在problem)transform ...collect 上map(f)
根据您的上下文和计算模型,这些解决方案中的一种或另一种可能更合适:您似乎正在呈现一般情况的特定情况,但尚不清楚一般情况是否应该涉及在未来迭代、在one Future中链接转换,或者完全是其他情况。
https://stackoverflow.com/questions/14524167
复制相似问题