该问题包含一些术语问题。
鉴于要求,“仅当条件为真时,我才需要运行第一个(未来)”,那么该要求的一种可能的实现是:
val f1 = if (cond) Some(Future(op)) else None
这是因为一个Future
一旦定义就会开始执行。
回到问题中的表达:
val x = for {
x1 <- f1 if y>2
x2 <- f2
} yield x1 + x2
这是在说“我想要result of f1
if(cond)
”而不是“我想execute f1
if(cond)
".
这将是一种方式:(注意 future 是如何在 for 理解中定义的,并且条件在外部):
val x = if (y > 2) {
for {
x1 <- Future(op1)
x2 <- Future(op2)
} yield x1 + x2
} else ???
在 for 理解中正确使用守卫是根据来自 for 理解所表达的计算的值来评估表达式。例如:
“我想要execute f2
仅当结果为f1
大于y
"
val x = for {
x1 <- f1
x2 <- Future(op) if x1 > y
} yield x1 + x2
请注意这里的条件如何涉及计算的中间结果(x1
在这种情况下)
旁注:要等待未来的结果,请使用Await.result(fut, duration)
代替Thread.sleep(duration)