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.
我正在一个范围内执行 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.