期权期货的 Finagle 过滤器序列

Finagle filter sequence of futures of option

我正在使用 twitter finagle 框架并给出了一系列未来的选项,我想根据选项的状态过滤它们。

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

函数bar : Foo => Bar可能是恒等式,但我不想return一个Option[Bar]。如果未定义该选项,我希望未来默默地失败,并且只对包含已定义选项的期货进行进一步处理。

我尝试了 flatten, flatMap, match case Some(_) => 的组合,但我没有过滤掉它们。如果我在未定义选项的地方抛出 Exception,所有期货处理都将失败(因为我在某个时候收集了它们)

我在 finagle guide

中找不到这个问题的任何解决方案

使用 finagle 框架过滤和链接期货的替代解决方案仍然值得赞赏。

此处 map 两层的问题(首先是 Seq,然后是 Future)是这种方法不允许您 "skip"计算空期权的期货。

如果你使用 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]](而不是你从[=21得到的Future[Seq[Foo]] =]),你有点倒霉。如果你愿意让任何 None 值导致 futures 失败,你可以这样做,但是当你调用 collect 之类的东西时,这些会爆炸,如果你想让它们保持沉默被忽略,你必须明确地处理这些失败。我强烈建议使用 Future.collect 并直接转到 Future[Seq[Foo]].