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)))',但这看起来不太好。 –