期权期货的Finagle过滤序列

Rad*_*scu 1 scala finagle twitter-finagle

我正在使用twitter finagle框架并给出一系列期望的期权我想根据期权的状态过滤它们.

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

该功能bar : Foo => Bar可以是身份,但我不想返回Option[Bar].如果未定义该选项,我希望未来能够无声地失败,并且只对包含已定义选项的期货进行进一步处理.

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

我在finagle指南中找不到任何解决这个问题的方法

使用finagle框架过滤和链接未来的替代解决方案仍然是值得赞赏的.

Tra*_*own 5

map这里的两层(首先是Seq,然后是Future)的问题是这种方法不允许你"跳过"计算空选项的期货.

如果你使用Future.collect(注意标准库和其他API调用这个操作sequence),你可以做一个单行,并最终得到一个Future[Seq[...]],这几乎总是比一个更好的东西Seq[Future[...]]:

def filteredFuture: Future[Seq[Foo]] = Future.collect(seqFuture).map(_.flatten)
Run Code Online (Sandbox Code Playgroud)

如果你真的需要从a Seq[Future[Option[Foo]]]到a Seq[Future[Foo]](而不是Future[Seq[Foo]]你从中获得collect),那你就有点运气了.你可以这样做,如果你愿意让任何None价值导致失败的期货,但是当你打电话给这样的事情时,这些会爆炸collect,如果你想要忽略它们,你将不得不处理那些失败明确.我强烈建议使用Future.collect并直接进入Future[Seq[Foo]].