Проблема с двумя слоями map
здесь (сначала Seq
, затем Future
) заключается в том, что этот подход не позволяет вам «пропустить» фьючерсы, которые вычисляют пустые опции.
Если вы используете Future.collect
(обратите внимание, что стандартная библиотека и другие API-интерфейсы называют эту операцию sequence
), вы можете сделать это как однострочник, а также получить Future[Seq[...]]
, что почти всегдаболее приятная вещь, чем Seq[Future[...]]
:
def filteredFuture: Future[Seq[Foo]] = Future.collect(seqFuture).map(_.flatten)
Если вам действительно нужно перейти от Seq[Future[Option[Foo]]]
к Seq[Future[Foo]]
(вместо Future[Seq[Foo]]
выполучить от collect
), вам отчасти не повезло.Вы можете сделать это, если вы хотите, чтобы любые значения None
приводили к неудачным фьючерсам, но они взорвутся, когда вы вызовете что-то вроде collect
, и если вы хотите, чтобы их игнорировали, вы 'Я должен обработать эти сбои явно.Я настоятельно рекомендую использовать Future.collect
и перейти непосредственно к Future[Seq[Foo]]
.