按未来结果的Scala筛选器集合
我有一个名为Source的类,它有lazy val isValid,它执行一些需要时间的网络检查。我让它返回Future[Boolean],这样它就不会阻塞主线程:按未来结果的Scala筛选器集合,scala,future,Scala,Future,我有一个名为Source的类,它有lazy val isValid,它执行一些需要时间的网络检查。我让它返回Future[Boolean],这样它就不会阻塞主线程: lazy val isValid: Future[Boolean] = doSomeChecks() 现在,我想检查几个源并丢弃无效的源。 下面是一些伪代码: val sources = Seq(Source1, Source2,...) val validOnes: Seq[Source] = sources.filter(_.
lazy val isValid: Future[Boolean] = doSomeChecks()
现在,我想检查几个源并丢弃无效的源。下面是一些伪代码:
val sources = Seq(Source1, Source2,...)
val validOnes: Seq[Source] = sources.filter(_.isValid)
我在想一种方法,可以将从isValid返回的Future[Boolean]转换成另一个Future,在验证检查完成后,用整个源对象进行解析
执行此操作的最佳方法是什么?无需从
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))
这也应该奏效
(未经编译器检查的代码,请在我的头顶上画一个草图;如果您想要一个可编译的解决方案,请提供最小的可编译示例)谢谢,只是想要一个想法,不需要提供工作代码。我只是想知道是否有比把它压缩成元组更干净的方法。
val validSources: Future[Seq[Source]] =
Future.sequence(sources.map(_.isValid)).map {
bs => (sources zip bs).filter(_._2).map(_._1)
}