3

我有一个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]]]

4

1 回答 1

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 }
于 2013-07-15T11:46:07.513 回答