Scala:for循环中的条件保护

时间:2015-11-09 21:08:01

标签: scala for-loop filter guard

我需要对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))),否则应用它。

有人可以告诉我一个体面的方法吗?

2 个答案:

答案 0 :(得分:2)

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

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
}

答案 1 :(得分:2)

您可以定义此类实用程序

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 ???