未来结果的Scala过滤器集合

时间:2018-02-03 22:34:01

标签: scala future

我有一个名为 Source 的类,它有lazy val isValid ,它执行一些需要时间的网络检查。我已经让它返回Future [Boolean]所以它不会阻止主线程:

df2

现在,我想检查一些 Sources 并丢弃无效的。< 这里有一些伪代码:

lazy val isValid: Future[Boolean] = doSomeChecks()

我正在考虑一些方法,它会将从 isValid 返回的Future [Boolean]转换为其他Future,它将在验证检查完成后用整个 Source 对象解析。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

编辑(1)摘要:使用zip添加了更短的解决方案。

无需从Source返回isValid本身。只需将源本身附加到isValid请求的每个结果。 一旦有效性检查结果出现,请过滤那些来源 是有效的,扔掉有效性布尔值:

val sources: Seq[Source] = ...

val validSources: Future[Seq[Source]] = (for {
  checkedSources <- Future.sequence(
    sources.map(s => s.isValid.map(b => (s, b)))
  )
} yield checkedSources.filter(_._2).map(_._1))

此处,s.isValid返回Future[Boolean]。此未来与b => (s, b)对应,因此s.isValid.map(b => (s, b))Future[(Source, Boolean)]Future.sequence将一堆期货转化为序列的单一未来。一旦计算了序列,就可以通过第二个组件对其进行过滤,然后可以丢弃第二个组件。

我不确定这是否是“最好”的方法,因为我不清楚有效性检查在多长时间内保持足够“新鲜”:它可能是{{1的一半结果在将所有结果收集到isValid序列中时,检查已过时。

编辑(1):更短:

checkedSources

这也应该有用。

(使用编译器取消选中的代码,粗略的草图;如果您需要可编译的解决方案,请提供最少的可编辑示例)