我有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]]]
?
答案 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 }