scala-在期货上使用for循环时如何展平嵌套的可选

时间:2018-10-22 07:50:15

标签: scala for-loop future for-comprehension

我正在对产生将来可选结果的范围执行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]]]

但是我想要的是没有OptionFuture[Seq[Result]]

的所有结果

2 个答案:

答案 0 :(得分:2)

flatten完成后,您可以Seq Future

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

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

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

答案 1 :(得分:1)

整理未来的内容。

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)