繁体   English   中英

价值从一系列期货初始化

[英]Values initialized from a chain of futures

考虑以下代码片段:

class MyClass {
  var a = _
  var b = _
  ...
  var y = _

  val z = (for {
    a0 <- someMethodReturningFuture
    b0 <- someMethodReturningFuture(a0)
    ...
    z0 <- someMethodReturningFuture(y0)
  } yield {
    a = a0
    b = b0
    ...
    y = y0
    someCalculation(y)
  }).result
}

是否可以执行这样的初始化,但使用val s而不是var s(不知何故)? 关键是,我不想阻止并等待每个中间结果,只是为了最后一个。

除非你有超过22个变量:

val (a, b, c, d, ..., v) = (for {
  a0 <- someMethodReturningFuture
  b0 <- someMethodReturningFuture(a0)
  ...
  u0 <- someMethodReturningFuture(t0)
} yield {
  (a0, b0, ..., u0, someCalculation(u0))
}).result

你能否使用lazy值来延迟result评估? 就像是:

class MyClass {

  lazy val a = myFutures.a.result
  lazy val b = myFutures.b.result

  private val myFutures = new AnyRef {
    val a = someMethodReturningFuture
    val b = a.map( a0 => someMethodReturningFuture(a0) )
  }

}

所有期货都是在初始化时创建的,没有阻塞,但是您将在第一次实际尝试使用结果时阻止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM