scala - 在将 for 循环与 futures 一起使用时如何展平嵌套的可选

scala - how to flatten nested optional when using for loop with futures

我正在一个范围内执行 for 循环,它会产生未来的可选结果。 我希望生成的集合仅包含非可选项目。

但我只剩下 Future[Seq[Option[Result]]]

代码看起来类似于:

val result = for {
        x <- 0 to numItems
      } yield {
        Future{
          ...logic...
          val intermediateResult: Option[Thing] = SomethingWhichReturnsOptionOfThing
          val s: Option[String] = intermediateResult map {
            ir => ...Do something with ir when it exists and then and map to String...
          }
          s map {
            string => Result(x, string)
          }
        }
      }
      Future.sequence(result) // Future[Seq[Option[Result]]]

但我想要的是没有 Option 的所有结果,即 Future[Seq[Result]]

扁平化以后的内容

scala> List(Some(1), None, Some(2))
res1: List[Option[Int]] = List(Some(1), None, Some(2))

res1.flatten
res2: List[Int] = List(1, 2)

一旦 Future 完成,您可以 flatten Seq

Future.sequence(result).map(_.flatten)

这将删除所有 None 值并从所有 Some 结果中提取 Result 值。

请注意,您将不再知道哪个 Result 来自哪个项目编号,并且 Future.sequence 也可能会丢弃一些错误,因此如果您想要准确的错误,这不是最佳解决方案 handling/reporting.