2011-12-14 21 views
36

Groovy sposób, aby zobaczyć, czy coś jest na liście jest użycie „w”Groovy nie w kolekcji

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

Jednak jak można ładnie zobaczyć, czy coś nie jest w kolekcji?

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

Wydaje się być brudny i "!" jest ukryty dla przypadkowego spojrzenia. Czy jest to bardziej idiomatyczny sposób na robienie tego?

Dzięki!

Odpowiedz

22

Myślę, że nie ma niestety dość składni not in. Ale można użyć zmiennej pomocnika aby uczynić go bardziej czytelnym:

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

Lub, w tym przypadku, można użyć wyrażenia regularnego :)

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

Innym sposobem, aby napisać to z contains, np

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

Zapisuje dodatkowy poziom nawiasów kosztem zastąpienia operatora wywołaniem metody.

+3

Wciąż stawia 'not' daleko od' contains', dzięki czemu łatwo przeoczyć w skrócie:/ –

7

bardziej czytelny, nie jestem pewien:

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

Dla przykładu:

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

Kilka miesięcy temu zaproponował new operator overloading ! (not operator). Teraz, być może można użyć dowolnej nieparzystej liczby okrzyki;)

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

W linku, kierownik projektu Codehaus Groovy "Zawsze możesz użyć jakiegoś triku expando metaclass, lub transformacji AST, aby dodać te isNot metody". Teraz, gdyby tylko napisał: "Użyję jakiejś sztuczki metadlasy expando lub transformacji AST, aby dodać te nie są metody w następnym wydaniu Codehaus Groovy". Wtedy nie mielibyśmy problemu. –

+5

if (!!! ('g' w ['a', 'b', 'c']))) - czytane jako "jeśli g naprawdę tak naprawdę nie jest na tej liście" – JesusFreke

0

Zgodnie z dokumentacją Grails o tworzeniu kryteriów here, można użyć coś takiego:

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

W tym przykładzie, masz Właściwość o nazwie "age" i chcesz uzyskać wiersze, które NIE są między 18 a 65. Oczywiście, część [18..65] można zastąpić dowolną listą wartości lub zakresu, których potrzebujesz.

+1

To prawda, ale moje pytanie nie było konkretnie o kryterium (które tworzy zapytanie sql.) Chciałem się dowiedzieć, czy język i biblioteki generalnie obsługują coś bardziej zwięzłego. –

10

można dodać nowe funkcje:

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