property - Groovy no está en la colección
groovy map to collection (5)
Creo que no hay una sintaxis bonita, desafortunadamente. Pero puedes usar una variable auxiliar para que sea más legible:
def isMagicChar = ch in [''a'', ''b'', ''c'']
if (!isMagicChar) ...
O, en este caso, puedes usar un regex :)
if (ch !=~ /[abc]/) ...
La manera maravillosa de ver si algo está en una lista es usar "en"
if(''b'' in [''a'',''b'',''c''])
Sin embargo, ¿cómo ves muy bien si algo no está en una colección?
if(!(''g'' in [''a'',''b'',''c'']))
Parece desordenado y el "!" está oculto a la mirada casual. ¿Hay alguna manera más idiomática de hacer esto?
¡Gracias!
Más legible, no estoy seguro:
assert [''a'',''b'',''c''].any{it == ''b''}
assert [''a'',''b'',''c''].every{it != ''g''}
Para tu ejemplo:
if ([''a'',''b'',''c''].every{it != ''g''})
Hace unos meses, ¡sugerí una nueva sobrecarga de operador! ( no operador) . Ahora, tal vez puedas usar cualquier cantidad impar de exclamaciones;)
if(!!!(''g'' in [''a'',''b'',''c'']))
Otra forma de escribirlo es con contains
, por ejemplo
if (![''a'', ''b'', ''c''].contains(''b''))
Se ahorra el nivel adicional de paréntesis a costa de reemplazar al operador con una llamada a método.
Puede agregar nuevas funciones:
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''])
Según la documentación de Grails sobre la creación de criterios here , puedes usar algo como esto:
not {''in''("age",[18..65])}
En este ejemplo, tiene una propiedad llamada "age"
y desea obtener filas que NO están entre 18 y 65. Por supuesto, la parte [18..65]
se puede sustituir con cualquier lista de valores o rango que necesite.