如何使用for-yield动态生成并行期货

时间:2014-05-12 09:40:14

标签: scala future yield

我的代码如下:

  val f1 = Future(genA1)
  val f2 = Future(genA2)
  val f3 = Future(genA3)
  val f4 = Future(genA4)

val results: Future[Seq[A]] = for {
  a1 <- f1
  a2 <- f2
  a3 <- f3
  a4 <- f4
} yield Seq(a, b, c, d)

现在我有一个要求可选择排除a2,如何修改代码? (也可以使用map或flatMap)

此外,如果我有可能的未来需要像上面那样进行汇总,并且M中的N可以选择性地排除某些标志(商业逻辑),我应该如何处理它?<​​/ p>

提前感谢!

莱昂

1 个答案:

答案 0 :(得分:2)

在问题1中,我理解你想从给定一些逻辑和问题2的序列中排除一个条目(例如B),你想要从总共M中抑制N个条目,并且在这些结果上计算未来。我们可以将这两种情况概括为:

// Using a map as simple example, but 'generators' could be a function that creates the required computation
val generators = Map('a' -> genA1, 'b' -> genA1, 'c' -> genA3, 'd' -> genA4)
...
// shouldAccept(k) => Business logic to decide which computations should be executed.
val selectedGenerators = generators.filter{case (k,v) => shouldAccept(k)}
// Create Seq[Future] from the selected computations
val futures = selectedGenerators.map{case (k,v) => Future(v)}
// Create Future[Seq[_]] to have the result of computing all entries.
val result = Future.sequence(futures)

一般来说,我认为您正在寻找的是Future.sequence,它需要Seq[Future[_]]并生成Future[Seq[_]],这基本上就是您“手动”做的事情。换理解。