我需要对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))
),否则应用它。
有人可以告诉我一个体面的方法吗?
答案 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 ???