【发布时间】:2016-12-30 22:05:50
【问题描述】:
StackOverflow 上有一些关于如何处理 Futures 列表的建议,但我想尝试自己的方法。但我无法编译以下代码
我有一份期货清单。 我想计算其中有多少通过或失败。我应该得到 (2,1) 我将它存储在一个元组中 我想采取的方法是遍历列表的每个元素。列表的元素是 Future[Int]。对于每个元素,我调用 flatMap 调用下一个递归循环(我假设如果调用 flatMap 则特定的未来会成功,所以我增加通过计数)。同样,我想在恢复和递增失败计数中调用下一个递归循环,但我得到了编译错误。
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success, Try}
import scala.concurrent.duration._
import scala.language.postfixOps
object ConcurrencyExample extends App {
type pass = Int
type fail = Int
val time = System.currentTimeMillis()
//use recursion to process each Future in the list
def segregate(l:List[Future[Int]]):Future[Tuple2[pass,fail]] = {
def go(l:List[Future[Int]],t:Tuple2[pass,fail]):Future[Tuple2[pass,fail]] = {
l match {
case Nil => Future{t}
//l is List of Future[Int]. flatMap each successful Future
//recover each failed Future
case l::ls => {
l flatMap (x => go(ls, (t._1 + 1, t._2)))
**l.recover({ case e => go(ls, (t._1 + 1, t._2))})**//I get error here
}
}
}
go(l,(0,0))
}
//hardcoded future
val futures2: List[Future[Int]] = List(Future {
1
}, Future {
2
}, Future {
throw new Exception("error")
})
val result = segregate(futures2)
result onComplete {
case Success(v) => println("pp:" + v)
case Failure(v) => println("fp:" + v)
}
Await.result(result,1000 millis)
}
【问题讨论】:
标签: scala