關於如何處理期貨列表,StackOverflow有一些建議,但我想嘗試自己的方法。但我無法編譯下面的代碼無法編譯未來列表的代碼
我有期貨的列表。 我想統計他們有多少人通過或失敗。我應該得到(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)
}
難道OP仍然有'(及格,不及格)',而不是一些'U'其中'U>:Int'? –
啊,我明白你的意思了。看起來你需要一個'asInstanceOf [Future [(pass,fail)]]'否則它會抱怨獲得'Future [Any]',但是之後它會爲我運行。 –
男士 - 謝謝。你的意思是這樣嗎?代碼編譯但我得到一個運行時錯誤java.lang.ClassCastException:java.lang.Integer不能轉換爲scala.Tuple2'我現在寫的代碼是'flatMap(x => go(ls ,(t._1 + 1,t._2))) l.asInstanceOf [Future [(pass,fail)]]。recoverWith({case e => go(ls,(t._1 + 1,t._2 ))})' –