64 votes

Groovy n'est pas dans la collection

La façon la plus simple de voir si quelque chose est dans une liste est d'utiliser "in".

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

Cependant, comment savoir si un élément ne figure pas dans une collection ?

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

Cela semble désordonné et le " !" est caché au premier regard. Existe-t-il une façon plus idiomatique de faire cela en groovy ?

Merci !

45voto

ataylor Points 31154

Une autre façon de l'écrire est avec contains par exemple

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

Il permet d'économiser le niveau supplémentaire de parenthèses au prix du remplacement de l'opérateur par un appel de méthode.

35voto

epidemian Points 10113

Je pense qu'il n'y a pas not in une jolie syntaxe, malheureusement. Mais vous pouvez utiliser une variable d'aide pour la rendre plus lisible :

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

Ou, dans ce cas, vous pouvez utiliser une regex :)

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

14voto

moskauerst Points 111

Vous pouvez ajouter de nouvelles fonctions :

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

9voto

Arturo Herrero Points 3676

Plus lisible, je ne suis pas sûr :

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

Pour votre exemple :

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

Il y a quelques mois, j'ai suggéré une nouvelle surcharge d'opérateurs ! ( no opérateur) . Maintenant, vous pouvez peut-être utiliser n'importe quel nombre impair d'exclamations ;)

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

1voto

reka18 Points 1251

Concernant l'une des réponses originales :

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

Quelqu'un a mentionné qu'il est facile de manquer le ! parce qu'il est loin de l'appel de la méthode. Cela peut être résolu en assignant le résultat booléen à une variable et en annulant simplement la variable.

def present = ['a', 'b', 'c'].contains('b')
if (!present) {
    // do stuff
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X