我有一个名为 Source 的类,它有lazy val isValid ,它执行一些需要时间的网络检查。我已经让它返回Future [Boolean]所以它不会阻止主线程:
df2
现在,我想检查一些 Sources 并丢弃无效的。< 这里有一些伪代码:
lazy val isValid: Future[Boolean] = doSomeChecks()
我正在考虑一些方法,它会将从 isValid 返回的Future [Boolean]转换为其他Future,它将在验证检查完成后用整个 Source 对象解析。
这样做的最佳方式是什么?
答案 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
这也应该有用。
(使用编译器取消选中的代码,粗略的草图;如果您需要可编译的解决方案,请提供最少的可编辑示例)