Подтвердить что ты не робот

Groovy не в коллекции

Способ groovy, чтобы увидеть, есть ли что-то в списке, использовать "in"

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

Однако как вы прекрасно видите, что что-то не в коллекции?

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

Кажется грязным и "!" скрыт от случайного взгляда. Есть ли более идиоматический способ groovy для этого?

Спасибо!

4b9b3361

Ответ 1

Я думаю, что нет синтаксиса not in, к сожалению. Но вы можете использовать вспомогательную переменную, чтобы сделать ее более читаемой:

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

Или в этом случае вы можете использовать регулярное выражение:)

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

Ответ 2

Другой способ записать это с помощью contains, например.

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

Он сохраняет дополнительный уровень скобок за счет замены оператора вызовом метода.

Ответ 3

Вы можете добавить новые функции:

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

Ответ 4

Более читаемый, я не уверен:

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

Ответ 5

Согласно документации Grails о создании критериев здесь, вы можете использовать что-то вроде этого:

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

В этом примере у вас есть свойство с именем "age", и вы хотите получить строки, которые НЕ находятся между 18 и 65. Конечно, часть [18..65] может быть заменена любым списком значений или диапазона, в котором вы нуждаетесь.