Scala:for循环中的条件保护

Scala: Conditional guard in for loop

我需要一些关于 Scala for 循环中守卫的启发:我的代码是

for {
  enterprise <- itr
  preferName <- enterprise \* qpreferedName
  variantName <- enterprise \* qvariantName
  attrVRes <- enterprise \* qtype \@ attrRes
  if (text(preferName).contains(keyword) || text(variantName).contains(keyword))
} {
//loop code
}

现在可以使用文件了。但是我想检查keyword的值,如果是空字符串,我不会应用这个守卫(if (text(preferName).contains(keyword) || text(variantName).contains(keyword))),否则应用它。

有人能告诉我一个好的方法吗?

因为 keyword 似乎是在 for comprehension 之外定义的,我会在那里设置一个布尔值,然后将它添加到守卫中。例如:

val keywordInvalid = keyword.isEmpty // Or however you want to define your condition

for {
  enterprise <- itr
  preferName <- enterprise \* qpreferedName
  variantName <- enterprise \* qvariantName
  attrVRes <- enterprise \* qtype \@ attrRes
  if keywordInvalid || text(preferName).contains(keyword) || text(variantName).contains(keyword)
} {
  //loop code
}

或者翻转它(根据@Łukasz 的评论):

val keywordValid = keyword.nonEmpty 
...
for {
  ...
  if keywordValid && ((text(preferName).contains(keyword) || text(variantName).contains(keyword))
} {
  //loop code
}

您可以定义这样的实用程序

def textContains(str: String): String => Boolean = str match {
  case "" => Function.const(true)
  case _ => text(_).contains(str)
}

并将其用作

for {
 /* ... */
if Seq(preferName,variantName).exists(textContains(keyword))
} yield ???