查看列表中是否存在某些内容的常规方法是使用“in”
if('b' in ['a','b','c'])
但是你如何很好地看到某个系列中是否有某些东西?
if(!('g' in ['a','b','c']))
似乎凌乱而且“!”隐藏的一瞥隐藏起来。是否有更惯用的常规方法来做到这一点?
谢谢!
答案 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 如果此字符串包含给定的文本
答案 7 :(得分:0)
disjoint
呢?
def elements = [1, 2, 3]
def element = 4
assert elements.disjoint([element])
element = 1
assert !elements.disjoint([element])
奖金:当元素匹配时,它将停止迭代