2011-12-14 47 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'])