Groovy не в коллекции
Способ groovy, чтобы увидеть, есть ли что-то в списке, использовать "in"
if('b' in ['a','b','c'])
Однако как вы прекрасно видите, что что-то не в коллекции?
if(!('g' in ['a','b','c']))
Кажется грязным и "!" скрыт от случайного взгляда. Есть ли более идиоматический способ groovy для этого?
Спасибо!
Ответы
Ответ 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]
может быть заменена любым списком значений или диапазона, в котором вы нуждаетесь.