首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >期权期货的Finagle滤波序列

期权期货的Finagle滤波序列
EN

Stack Overflow用户
提问于 2019-02-27 13:25:30
回答 1查看 288关注 0票数 1

我正在使用twitter finagle框架,并给出了未来的选项序列,我想根据选项的状态对它们进行筛选。

代码语言:javascript
复制
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框架过滤和链接期货的替代解决方案仍将受到欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 13:42:35

这里的两个map层(首先是Seq,然后是Future)的问题是,这种方法不允许您“跳过”计算空选项的未来。

如果您使用Future.collect (请注意,标准库和其他APIs将此操作称为sequence),则可以将其作为一个一行程序来完成,并最终得到一个Future[Seq[...]],这几乎总是比Seq[Future[...]]更好的功能。

代码语言:javascript
复制
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]]

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54906567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档