我正在使用twitter finagle框架,并给出了未来的选项序列,我想根据选项的状态对它们进行筛选。
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框架过滤和链接期货的替代解决方案仍将受到欢迎。
发布于 2019-02-27 13:42:35
这里的两个map层(首先是Seq,然后是Future)的问题是,这种方法不允许您“跳过”计算空选项的未来。
如果您使用Future.collect (请注意,标准库和其他APIs将此操作称为sequence),则可以将其作为一个一行程序来完成,并最终得到一个Future[Seq[...]],这几乎总是比Seq[Future[...]]更好的功能。
def filteredFuture: Future[Seq[Foo]] = Future.collect(seqFuture).map(_.flatten)如果您真的需要从一个Seq[Future[Option[Foo]]]转到一个Seq[Future[Foo]] (而不是从collect获得的Future[Seq[Foo]] ),那么您就有点不走运了。如果您愿意让任何None值导致失败的未来,那么您可以这样做,但是当您在一行中调用类似collect的内容时,这些值会崩溃,如果您希望它们被默默地忽略,您将不得不显式地处理这些故障。我强烈建议使用Future.collect并直接访问Future[Seq[Foo]]。
https://stackoverflow.com/questions/54906567
复制相似问题