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

Scala Future带有用于理解的过滤器

盛琪
2023-03-14

在下面的示例中,我得到异常java.util.NoSuchElementException:Future.filter谓词不满足

当检查< code>if( i == 2 )失败时,我希望得到结果< code>Future( Test2 )。我如何在一个处理组合未来的for理解中处理filter/if?

下面是一个在Scala REPL中工作的简化示例。

代码:

import scala.concurrent.Future
import scala.util.{ Try, Success, Failure }
import scala.concurrent.ExecutionContext.Implicits.global

val f1 = Future( 1 )
val f2 = for {
  i <- f1
  if( i == 2 )
} yield "Test1"
f2.recover{ case _ => "Test2" }
f2.value

共有3个答案

端木兴国
2023-03-14

当然,我自己想出了一个解决办法。也许有更好、更惯用的解决方案?

import scala.concurrent.Future
import scala.util.{ Try, Success, Failure }
import scala.concurrent.ExecutionContext.Implicits.global

val f1 = Future( 1 )
val f2 = for {
  i <- f1
  if( i == 2 )
} yield "Test1"
val f3 = f2.recover{ case _ => "Test2"  }
// OR val f3 = f2.fallbackTo( Future( "Test2" ) )
f3.value
丰博
2023-03-14

中,为了理解,您通过i==2进行过滤。由于f1的值不是2,因此它不会产生成功,而是失败。正如您的error消息告诉您的那样,筛选器的谓词不满足。但是,f2.recover返回一个新的未来f2的值未被操纵。它仍然存储故障。这就是调用<code>f2.value</code>时出现错误消息的原因我能想到的唯一替代方法是在您的中使用else来理解,如下所示。

val f2 = for ( i <- f1) yield {
  if (i == 2) "Test1"
  else "Test2"
}
f2.value

这将返回<code>一些(成功(Test2)),与<code>f3.值一样。

邹阳
2023-03-14

在我看来,这是一个更惯用的解决方案。此谓词函数创建包含异常的<code>未来[Unit]成功(“Test1”)或失败(“Test2”)。这与“Test1”和“Test2”略有不同,但我发现这种语法更有用。

def predicate(condition: Boolean)(fail: Exception): Future[Unit] = 
    if (condition) Future( () ) else Future.failed(fail)

你这样使用它:

val f2 = for {
  i <- f1
  _ <- predicate( i == 2 )(new Exception("Test2"))
  j <- f3  // f3 will only run if the predicate is true
} yield "Test1"
 类似资料:
  • 我正在尝试在Scala中构建一个理解,但是当我尝试使用更复杂的过滤器时遇到了一些问题。 我知道理解过滤的基础: 但是,我想构建一个具有更复杂的过滤语句的for理解。例如,这里有一个我正在尝试做的说明性版本: 基本上,如果您想使用一些更复杂的需求进行筛选,这会变得很尴尬,因为for理解不允许在filter语句中声明变量,否则您必须将所有这些都适合一行。 另一种选择是根本不使用过滤机制,只生成一些(e

  • 问题内容: 我正在尝试建立一个查询,该查询将找到所有用户文档(docType =用户),然后根据许多过滤器对其进行过滤。例如位置,性别,年龄等。过滤器是根据我正在构建的搜索功能上的用户输入来添加/删除的。 以下没有结果: 以下返回结果: 后者虽然返回结果,但从长远来看是行不通的,因为我可能想为年龄,性别等添加一个额外的过滤器,而且我似乎无法添加多个字段。如果我删除位置过滤器,则第一个查询有效。 问

  • AngularJS过滤器用来格式化输出给用户的数据。除了格式化数据,过滤器还能修改DOM。这使得过滤器通常用来做些如“适时地给输出加入CSS样式”等工作。 比如,你可能有些数据在输出之前需要根据进行本地化。你可以向下面这样使用链式的过滤器来传递表达式: name | uppercase 这个表达式执行时会将name的值传递给uppercase过滤器。

  • 为了解决这一限制, 从发布AEM实例启动的工作流:当从AEM发布实例提交自适应表单、交互式通信或信件时,所有工作流实例都使用服务用户创建。在这些情况下,工作流实例数据中不会捕获登录用户的用户名。 我添加了一个过滤器servlet来拦截AEM Forms servlet之前的初始表单提交,使用请求包装器修改请求正文,添加原始用户ID。 我审查了以下资源: 如何在java过滤器中更改servlet请求

  • 问题内容: 我想在Angular中使用ng-repeat,而我只想输出数组的某些元素。一个例子: 但是,这不起作用。请告诉我该怎么做;仅输出元素的精确索引。 问题答案: 在您的代码中,过滤器应用于“ items”数组,而不是应用于每个数组项,这就是为什么它无法按预期工作的原因。 相反,您可以使用ng-show(或ng-if): 请参阅:http://jsfiddle.net/H7d26 编辑:如果

  • 问:在GoogleSheets中,仅使用内置函数,如何编写一个过滤器,根据每行中的一列不在另一个范围的有效值列表中排除记录。 详细资料 我正在使用Google Sheets编写一个财务电子表格,其中我所有的支出和收入都输入到一个名为“交易”的表格中。我有一个单独的表叫做常量,在这里我有一个收入类别列表和一个费用类别列表。 以下是一些用于问题的示例数据: 常数 交易 我有一张名为ByMonth的表格