代码之家  ›  专栏  ›  技术社区  ›  Avba

scala-使用for loop with futures时如何扁平嵌套可选

  •  0
  • Avba  · 技术社区  · 6 年前

    我在表演 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]]

    2 回复  |  直到 6 年前
        1
  •  2
  •   Tim    6 年前

    你可以 flatten 这个 Seq 一旦 Future 已完成:

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

    这将删除所有 None 值并提取 Result 来自所有人的价值 Some 结果。

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

        2
  •  1
  •   Terry Dactyl    6 年前

    扁平化未来的内容。

    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)