Groovy不在收藏中

时间:2011-12-14 02:28:29

标签: groovy

查看列表中是否存在某些内容的常规方法是使用“in”

   if('b' in ['a','b','c'])

但是你如何很好地看到某个系列中是否有某些东西?

  if(!('g' in ['a','b','c']))

似乎凌乱而且“!”隐藏的一瞥隐藏起来。是否有更惯用的常规方法来做到这一点?

谢谢!

8 个答案:

答案 0 :(得分:27)

另一种写作方式是使用contains,例如

if (!['a', 'b', 'c'].contains('b'))

它以节省方法调用替换运算符为代价来节省额外的括号。

答案 1 :(得分:26)

不幸的是,我认为没有not in漂亮的语法。但您可以使用辅助变量使其更具可读性:

def isMagicChar = ch in ['a', 'b', 'c']
if (!isMagicChar) ...

或者,在这种情况下,您可以使用正则表达式:)

if (ch !=~ /[abc]/) ...

答案 2 :(得分:10)

您可以添加新功能:

Object.metaClass.notIn = { Object collection ->
    !(delegate in collection)
}


assert "2".notIn(['1', '2q', '3'])
assert !"2".notIn(['1', '2', '3'])

assert 2.notIn([1, 3])
assert !2.notIn([1, 2, 3])

assert 2.notIn([1: 'a', 3: 'b'])
assert !2.notIn([1: 'a', 2: 'b'])

答案 3 :(得分:7)

更具可读性,我不确定:

assert ['a','b','c'].any{it == 'b'}
assert ['a','b','c'].every{it != 'g'}

对于你的例子:

if (['a','b','c'].every{it != 'g'})

几个月前,我建议new operator overloading ! (not operator)。现在,也许你可以使用任何奇数的惊呼;)

if(!!!('g' in ['a','b','c']))

答案 4 :(得分:1)

关于原始答案之一:

if (!['a', 'b', 'c'].contains('b'))

有人提到很容易错过!因为它离方法调用很远。可以通过将布尔结果分配给变量来解决此问题,而只需对变量求反。

def present = ['a', 'b', 'c'].contains('b')
if (!present) {
    // do stuff
}

答案 5 :(得分:0)

根据Grails有关创建条件here的文档,您可以使用以下内容:

not {'in'("age",[18..65])}

在此示例中,您有一个名为"age"的属性,并且您希望获得不在18到65之间的行。当然,[18..65]部分可以替换为任何值列表或你需要的范围。

答案 6 :(得分:0)

contains(string)方法很容易阅读,如果要检查的列表中包含或不包含某些内容。请查看下面的示例以了解更多信息。

示例

//Any data you are looking to filter  
List someData = ['a', 'f', 'b', 'c', 'o', 'o']

//A filter/conditions to not match or match against
List myFilter = ['a', 'b', 'c'] 

//Some variables for this example
String filtered, unfiltered 

//Loop the data and filter for not contains or contains
someData.each {
   if (!myFilter.contains(it)){
      unfiltered += it
   } else {        
      filtered += it
   }
}

assert unfiltered = "foo"
assert filtered = "abc"

CONTAINS()

参数:文本-要查找的字符串。

返回:true 如果此字符串包含给定的文本

source

答案 7 :(得分:0)

disjoint呢?

def elements = [1, 2, 3]
def element = 4
assert elements.disjoint([element])
element = 1
assert !elements.disjoint([element])

奖金:当元素匹配时,它将停止迭代