按未来结果的Scala筛选器集合

按未来结果的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(_.

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

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)
  }