2011-12-14 10 views
36

Il modo groove per vedere se qualcosa è in una lista è quello di utilizzare "in"Groovy non nella collezione

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

Tuttavia come si fa a ben vedere se qualcosa non si trova in una collezione?

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

Sembra disordinato e il "!" è nascosto allo sguardo casuale. C'è un modo più groovy più idiomatico per fare questo?

Grazie!

risposta

22

Penso che non ci sia una bella sintassi not in, sfortunatamente. Ma è possibile utilizzare una variabile helper per renderlo più leggibile:

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

O, in questo caso, è possibile utilizzare una regex :)

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

Un altro modo di scrivere è con contains, per esempio

Salva il livello aggiuntivo di parentesi al costo di sostituire l'operatore con una chiamata di metodo.

+3

Ancora mette il 'not' lontano dal' contains', rendendo più semplice per perdere a colpo d'occhio:/ –

7

più leggibile, non sono sicuro:

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

Per esempio:

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

Qualche mese fa, ho suggerito un new operator overloading ! (not operator). Ora, forse è possibile utilizzare qualsiasi numero dispari di esclamazioni;)

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

Al tuo link, il responsabile del progetto Codehaus Groovy ha detto "Puoi sempre usare qualche espediente di metaclassi expando, o una trasformazione AST, per aggiungere quei metodi isNot". Ora, se solo avesse scritto "Userò qualche espediente metaclasse expando, o una trasformazione AST, per aggiungere quei metodi isNot nella prossima versione di Codehaus Groovy". Quindi non avremmo un problema. –

+5

if (!!! ('g' in ['a', 'b', 'c'])) - leggi come "se g è davvero davvero non in questa lista" – JesusFreke

0

Secondo la documentazione Grails sulla creazione di criteri here, è possibile utilizzare qualcosa di simile:

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

In questo esempio, si dispone di una proprietà denominata "age" e si desidera ottenere righe NON tra 18 e 65. Naturalmente, la parte [18..65] può essere sostituita con qualsiasi elenco di valori o intervallo necessario.

+1

Vero, ma la mia domanda non era in particolare su un criterio (che sta costruendo una query sql). Volevo sapere se il linguaggio groovy e le librerie generalmente supportano qualcosa di più succinto. –

10

È possibile aggiungere nuove funzioni:

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