0
假設我們有一個Scala Future
結果的序列,比如val futures: Seq[Future[Boolean]]
,我們假設我想獲得一個返回第一個true
結果的Future[Boolean]
,但是否則它會失敗或返回false。從Scala期貨列表中提取成功的最簡單方法是什麼?
目前目前實施我已經是這樣的:
// convert to Seq[Future[Try[Boolean]]]
val tries = futures.map{ _.map(Success(_)).recover{ case t: Throwable => Failure(t) } }
val sequence = Future.sequence(tries)
// first positive
val positive = sequence.map{ _.find{ case Success(true) => true; case _ => false } }
val nonpositive = sequence.map{ _.find{ case Success(true) => false; case _ => true } }
// prioritise positive results over other results
val futureTry =
for {
p <- positive
n <- nonpositive
} yield(p.orElse(n))
// convert from Future[Try[Boolean]] back to Future[Boolean]
val future = futureTry.map { _.map { t => t.get } }
是否有上面寫一個簡單的方法?
看起來不錯,它的實施缺乏上述的唯一的事情是,如果沒有找到成功的故障必須傳播。在上面的內容中,我們只是放棄了任何失敗,因爲它們被轉換爲「無」。有沒有簡單的方法呢? –
一種可能的方法是做類似於我最後一個例子的東西,但是返回失敗的'Future',你用'Future.sequence'獲得:'f3.flatMap(_。map(Future.successful _)。getOrElse(Future。序列(failedF :: Nil).map(_。head)))',但這看起來不太好。 –