scala - 展平 Future[Option[Option[T]]] 的 Option 部分

标签 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]]]

最佳答案

您可以编写一个通用函数,例如:

,而不是将其专门用于选项
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/

相关文章:

scala - 使用Scala时,是否有热键可用于在IntelliJ中搜索引用?

java - 在java中,有没有办法在线程进入等待状态而不是完成时将其设为 "Join"?

scala - 为什么Scala有利于并发?

c#-4.0 - 我是否需要将 RowVersion TimeStamp 类型属性 "Entity Framework Code First"添加到 Parent 和 Child 类?

java - 不使用同步的 Java 并发中的奇怪行为

scala - akka:如何测试 Actor 是否被停止

scala - 如何使用scala运行Spark Streaming的Twitter流行标签?

scala - Scala Slick如何将Scala代码转换为JDBC?

scala - 为什么 scala value class#toString 包含案例类信息?

python - 在 Python 中使用协程进行并行编程