Scala有没有像flatYield那样的东西?

时间:2018-01-11 14:39:28

标签: scala future for-comprehension

类似的问题已被问到here,但有些回复并未完全承认如何异步运行原始的“独立”Future(而不是链接flatMap s或for-comprehension)。我也很好奇这个案例有多个链接Future,它们都依赖于原始Future但不相互依赖。

无论如何,这就是我正在做的事情:

val f0 = Future { foo() }
val f1 = Future { bar() }
val f01 = for { v0 <- f0; v1 <- f1 } yield (v0, v1)
f01.flatMap { case (v0, v1) =>
  val f2 = Future { baz(v0, v1) }
  val f3 = Future { qux(v0, v1) }
  for { v2 <- f2; v3 <- f3 } yield (v2, v3)
}

这就是我想做的事情:

val f0 = Future { foo() }
val f1 = Future { bar() }
for { v0 <- f0; v1 <- f1 } flatYield {
  val f2 = Future { baz(v0, v1) }
  val f3 = Future { qux(v0, v1) }
  for { v2 <- f2; v3 <- f3 } yield (v2, v3)
}

有没有办法在不首先产生原始值然后在链式flatMap的参数中再次写出它们的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

它对你有用吗?

val f0 = Future { foo() }
val f1 = Future { bar() }
for { 
  v0 <- f0
  v1 <- f1 
  f2 = Future { baz(v0, v1)}
  f3 = Future { qux(v0, v1)}
  v2 <- f2
  v3 <- f3
} yield (v2, v3)

答案 1 :(得分:2)

另一种简化代码的方法是使用zip的{​​{1}}方法:

Future

对于更多for { (v0, v1) <- Future { foo() } zip Future { bar() } r <- Future { baz(v0, v1) } zip Future { qux(v0, v1) } } yield r 而不是多个Future,您还可以使用zip

Future.sequence

在这两种情况下,压缩/排序的期货将并行执行(当然,取决于for { List(a, b, c, d) <- Future.sequence(List( Future { foo1() }, Future { foo2() }, Future { foo3() }, Future { foo4() } )) /* ... */ } yield ??? )。