展平期货的期权部分[期权[期权[T]]]

时间:2013-07-15 11:15:30

标签: scala concurrency

我有results: List[Future[Option[T]]]包含(并行)计算。

我希望尽快获得第一个非None结果,或者如果所有计算都返回None则返回None

目前,我正在这样做(我认为这很丑陋)来处理Future.find找不到任何结果的情况。

Future.find(results)(r => r.isDefined) map { 
  case Some(hit) => hit
  case _ => None
}

这会给我一个Future[Option[T]](我想要的)。

是否有更简洁的方法来获取Future[Option[T]]:即无需手动压扁Future[Option[Option[T]]]

1 个答案:

答案 0 :(得分:1)

您可以编写一般函数,例如:

,而不是将其专门用于选项
def collectFirst[A, B](futures: List[Future[A]])(pfn: PartialFunction[A, B])
    (implicit ex: ExecutionContext): Future[Option[B]] =
  Future.find(futures)(pfn.isDefinedAt) map (_.collect(pfn))

就此而言,您可以将问题改写为:

collectFirst(results) { case Some(hit) => hit }