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

对于具有 if 筛选器的表达式会导致错误

冯沛
2023-03-14

如何重构我的代码,以便我的 for 表达式中没有 if 语句?

我得到一个执行异常:

[NoSuchElementException: Future.filter predicate is not satisfied]

我正在下面定义一个if选项,这导致了问题:

val maybeUserFut: Future[Option[User]] = 
    for {
          usernameOpt <- lookupUsername("...")
          if usernameOpt.isDefined
            userOpt <- getUser(usernameOpt.get)
        } userOpt

我应该开始使用什么模式来避免此错误?

共有1个答案

农鸿达
2023-03-14
for {
  usernameOpt <- lookupUsername("...")
  if usernameOpt.isDefined
    userOpt <- getUser(usernameOpt.get)
} yield userOpt

被转化成

lookupUsername("...")
  .withFilter({ usernameOpt => usernameOpt.isDefined })
  .flatMap({ usernameOpt =>
    getUser(usernameOpt.get).map({ userOpt =>
      userOpt
    })
})

< code>Future.withFilter定义为(source):

def filter(p: T => Boolean)(implicit executor: ExecutionContext): Future[T] =
  map {
    r => if (p(r)) r else throw new NoSuchElementException("Future.filter predicate is not satisfied")
  }

因此,没有一个简单的转换会起作用。

我可能会这样写:

lookupUsername("...").flatMap({ usernameOpt =>
  usernameOpt match {
    case None           => Future.successful(None)
    case Some(username) => getUser(username)
  }
})

如果您想使用< code>for comprehension语法,您将需要一个像Scalaz OptionT这样的monad转换器,它将显式提升抽象为< code>Future(例如< code>case None =

import scalaz._
import Scalaz._
import scalaz.OptionT._

val maybeUserFut: Future[Option[User]] = 
  (for {
    username <- optionT(lookupUsername("..."))
    user <- optionT(getUser(username))
  } yield user).run
 类似资料:
  • 我在正确表达ElasticSearch regexp过滤器的regexp时遇到了问题。我正在尝试匹配url字段中“info-for/media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press-release-1。为了尝试获得正确的正则表达式,我现在使用,但最终将是带有用户查询字符串的。 发布到localhost:9200/_search 这返

  • 所以浮点运算是不精确的,但这并不能完全解释这里发生的事情:

  • 建议将以下语句更改为NetBeans中的lambda表达式。 但是,当我应用假定的更改(Alt Enter)时,我得到了: 当这不会与消息一起编译时: 没有找到合适的构造函数为KeyFrame(持续时间,(事件前夕[…]}}})-参数不匹配 问题是为什么NetBeans会提出一些它无法实现的东西?如何在Timeline构造函数中实际使用lambda函数?谢谢

  • 指定在表达式计算结果为 TRUE 时执行的命令。 if(表达式) 备注 包含表达式的 if 语句与像 If FoundColor <> Blue 这样的传统 if 语句的区别是,它在单词“if”后的字符为左大括号。尽管通常把整个表达式包围在括号中,不过也可以写成这样:if (x > 0) and (y > 0)。此外, 如果单词 "if" 后是 函数调用 或者类似 "not" 或 "!" 的运算符

  • 问题内容: 我有一个查询,看起来像这样: 导致以下异常: 如果删除DISTINCT关键字,查询将运行没有问题。如果删除order by子句,则查询运行不会出现问题。不幸的是,我似乎无法获得没有重复的有序结果集。 问题答案: 您正在尝试使用未计算的列对结果进行排序。如果您不在那里,那将不是问题,但是由于查询基本上只按列分组,因此如何将结果集与可以具有相同值的其他列进行排序 ?

  • 我有以下代码: 这会导致错误: 但是,在以下情况下(其中三元表达式中的括号已被删除): 没有错误,欢迎消息显示正确。 为什么会这样呢?在我的印象中,括号在三元表达式中是可选的。我认为这与求值的顺序有关,但是由于三元表达式在不同的行上,所以< code>let person = {...,我不清楚为什么会发生这种情况。 事实上,在我正在学习的JavaScript课程中,教师展示了下面的例子,无论有没