当前位置: 首页 > 知识库问答 >
问题:

按未来结果收集Scala过滤器

越季萌
2023-03-14

我有一个名为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]转换为其他将来,在验证检查完成后,可以使用整个源对象进行解析。

最好的方法是什么?

共有1个答案

江礼骞
2023-03-14

无需从返回源代码本身是有效的。只需将源代码本身附加到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))

这里,< code>s.isValid返回一个< code>Future[Boolean]。这个未来是用< code>b =映射的

我不确定这是否是做到这一点的“最佳”方式,因为我不清楚有效性检查保持足够“新鲜”的时间有多长:很可能在所有结果都收集到< code>checkedSources序列中时,< code>isValid检查的结果中有一半已经过期。

编辑(1):更短:

val validSources: Future[Seq[Source]] = 
  Future.sequence(sources.map(_.isValid)).map {
    bs => (sources zip bs).filter(_._2).map(_._1)
  }

这个应该也可以。

(代码未经检查用编译器,粗略的草图了我的头顶;如果您想要一个可编译的解决方案,请提供最小的可编译示例)

 类似资料:
  • 6.4.1.SetIDRange (设置查询ID范围) 原型:function SetIDRange ( $min, $max ) 设置接受的文档ID范围。参数必须是整数。默认是0和0,意思是不限制范围。 此调用执行后,只有ID在$min和$max(包括$min和$max)之间的文档会被匹配。 6.4.2.SetFilter (设置属性过滤) 原型:function SetFilter ( $at

  • 问题内容: 我需要返回不包含具有特定ID的文档的结果。Elasticsearch允许我们指定允许使用哪些ID,但是我看不到任何禁止某些ID的方法。在我的情况下,我不想返回用户已经看到的内容,因此每个用户的列表都不同。 问题答案: 您可以通过添加一个过滤器来实现此目的,该过滤器包含一个过滤器,该过滤器带有您不想显示的ID数组,如下所示:

  • 问题内容: 我的表格显示了各个国家/地区进行的搜索量以及进行搜索的日期,我想要一个查询来向我显示2012年和2013年每个月的搜索量,我需要为月份添加单独的列,年份和搜索次数。我以前使用过下面的查询,该查询返回每周进行的搜索量,但我想将其更改为仅2012和2013年每月进行的搜索。 问题答案: 只需使用MONTH()和YEAR()函数

  • 我有一些函数返回带有未来的元组元素列表(Int, Int)。为简单起见,我将定义两个未来 我想用下面的标准过滤并获取这两个未来列表中的元素。 在第二个位置包含相同元素的元组 在此方案中,输出应为 我可以用普通的列表(没有未来)来做这件事,比如下面的理解 如何与期货一起做?

  • 我有一个Scala future,它调用一个api并返回future,如果结果不正确,那么另一个api调用将与第一个future的结果一起提交并作为future返回。 这是我目前为止所拥有的。 但是如果我访问fut2结果,它会给出这样的结果: 有没有一种方法,我可以选择返回fot2,如果fot1的结果是不准确的? 编辑:第二个未来必须使用第一个未来来继续API调用。这就是我到目前为止所拥有的。

  • 我有以下代码,即从返回CompletableFuture的web API获取给定时间间隔的报告。如果超过了返回报告的行数,时间间隔将被分成两半,并为两半调用API。这将递归重复,直到行数满足条件。 我想得到完全未来 我的代码在不需要进行间隔拆分时运行正常。如果需要递归调用,它将只返回空列表,递归调用将在稍后异步执行。 我也尝试过使用类似的东西,但没用: 如果我知道自己做错了什么,我会心存感激。谢谢