2014-05-12 44 views
2

我有下面的代码并行期货:如何动态生成与收益

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,如何修改密码? (有地图或flatMap也可以)

此外,比如说如果我有M个将来可能需要像上面那样聚合,并且N的M可以被选择性地排除某些标志(biz逻辑),我该如何处理它?

在此先感谢!

莱昂

+0

你的问题很难理解。 “可选”输出b意味着什么? if(outputB){... Seq(a,b,c,d)} else {Seq(a,c,d)}? – maasg

+0

对不起。我其实是指“退出”:)我改变了这个问题。 – anuni

回答

2

在问题1,我知道你是想排除从给定的一些逻辑和问题2,你想从总共M的剿N个条目的序列中的一个条目(例如B),并有未来根据这些结果计算。我们可以概括这两种情况下是这样的:

// 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[_]],这基本上是你在做什么“手动”与理解。

+0

非常感谢!我会试一试。 – anuni