Groovy不在collections

看看列表中是否有东西的常规方法是使用“in”

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

但是,您如何很好地了解某件东西是否不在集合中?

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

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

谢谢!

不幸的是,我认为没有一个漂亮的语法。 但是你可以使用一个辅助variables来使其更具可读性:

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

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

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

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

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

它以一个方法调用代替操作符的代价节省了额外的括号。

你可以添加新的function:

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

更可读,我不确定:

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

举个例子:

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

几个月前,我提出了一个新的操作符重载! ( 不是运营商) 。 现在,也许你可以使用任何奇数的感叹号;)

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

根据Grails关于在这里创build标准的文档,你可以使用像这样的东西:

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

在这个例子中,你有一个名为"age"的属性,你想得到[18..65] 18到65之间的行。当然, [18..65]部分可以用你需要的值或范围的任何列表来代替。