Finagle фильтр последовательности фьючерсов опциона - PullRequest
0 голосов
/ 27 февраля 2019

Я использую twitter finagle framework и учитывая последовательность будущих опций, я хотел бы отфильтровать их по состоянию опции.

seqFuture : Seq[Future[Option[Foo]]] 
val filteredFuture = seqFuture map { fut => fut map {
      opt => if(opt.isDefined) bar(opt.get)
   }
}

Функция bar : Foo => Bar может быть тождественной,но я не хочу возвращать Option[Bar].Если опция не определена, я хочу, чтобы будущее молча проваливалось, а дальнейшая обработка цепочки выполнялась только для тех фьючерсов, которые содержат определенную опцию.

Я пробовал комбинацию flatten, flatMap, match case Some(_) =>, но не пришел к фильтрацииих.Если я брошу Exception там, где опция не определена, вся обработка фьючерсов завершится неудачей (так как я собираю их в какой-то момент)

Я не смог найти никакого решения этой проблемы в руководстве finagle

Альтернативные решения для фильтрации и связывания фьючерсов с использованием структуры finagle по-прежнему приветствуются.

1 Ответ

0 голосов
/ 27 февраля 2019

Проблема с двумя слоями 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]].

...