2011-12-14 58 views
36

的常规方法,如果事情是在一个列表是使用“在”Groovy中没有收集

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

但是你怎么很好看,如果事情是不是一个集合中?

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

似乎凌乱和“!”隐藏在随便的一瞥中。有没有更习惯性的常规方式来做到这一点?

谢谢!

回答

22

不幸的是,我认为没有not in漂亮的语法。但是你可以使用一个辅助变量,以使其更易于阅读:

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

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

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

另一种方式来写它与contains,例如

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

它以一个方法调用替换运算符的代价节省了括号的额外级别。

+3

仍然会将`not`远离`contains`,因此很容易一眼就错过:/ – 2014-04-18 14:52:23

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'])) 
+1

在你的链接,该Codehaus的Groovy项目经理说:“你总是可以使用一些expando元类技巧或者AST转换来添加那些isNot方法。”现在,如果他只写了“我将使用一些expando元类别技巧或AST转换,在下一个Codehaus Groovy版本中添加isNot方法”。那我们就不会有问题了。 – 2011-12-17 00:30:36

+5

if(!!! ['a','b','c']))中的'g') - 读作“如果g真的不在此列表中” – JesusFreke 2012-10-30 03:46:04

0

据Grails的文档有关创建标准here,你可以使用这样的事情:

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

在这个例子中,你有一个属性名为"age",并且您想获取不在18和65之间的行。当然,[18..65]部分可以用您需要的任何值或范围列表替换。

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'])