我有一个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]]]
?
最佳答案
您可以编写一个通用函数,例如:
,而不是将其专门用于选项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 }
关于scala - 展平 Future[Option[Option[T]]] 的 Option 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652966/