scala - как сглаживать вложенные необязательные при использовании для цикла с фьючерсами - PullRequest
0 голосов
/ 22 октября 2018

Я выполняю цикл 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 ]

0 голосов
/ 22 октября 2018

Вы можете flatten Seq после завершения Future:

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

Это удалит все значения None и извлечет значение Result из всех результатов Some.

Обратите внимание, что вы больше не будете знать, какой Result пришел с какого номера элемента, и Future.sequence также может отбрасывать некоторые ошибки, так что это не лучшее решение, если вам нужна точная обработка ошибок и отчетность.

0 голосов
/ 22 октября 2018

Расплющить содержимое будущего.

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)
...