期权期货的 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 框架过滤和链接期货的替代解决方案仍然值得赞赏。
此处 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]]
.
我正在使用 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 框架过滤和链接期货的替代解决方案仍然值得赞赏。
此处 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]]
.