¿Hay una mejor manera de escribir este cheque nulo y un cheque no vacío en groovy?

101

Necesito realizar una verificación nula / vacía en algún código, antes de realizar alguna lógica. Tengo el artículo a continuación, porque creo que !members?.emptyno es correcto.

¿Existe una forma más divertida de escribir lo siguiente?

if (members && !members.empty) {
    // Some Work
}
Jay Bose
fuente

Respuestas:

209

De hecho, existe un Camino Groovier.

if(members){
    //Some work
}

hace todo si memberses una colección. Cheque nulo y cheque vacío (las colecciones vacías están obligadas a hacerlo false). Salve la maravillosa verdad . :)

dmahapatro
fuente
3
Una forma más "groovier" es que, por ejemplo, si está interesado en la edad máxima de los miembros, puede escribir lo siguiente: miembros? .Age.max ()
BTakacs
9
Nota: members?.age.max()explota con "No se puede invocar el método max () en un objeto nulo" cuando los miembros son nulos. Necesitaríasmembers?.age?.max()
GreenGiant
@VinodJayachandran Sí
dmahapatro
2
no: la solución de GreenGiant es la mejor: comprobar List members = null;y List members = [ [age: 12], [age: 24], [age: null], null ]contra ambas soluciones
BTakacs
2
Este tipo de verificación funciona para la mayoría de los casos, pero si su propósito es verificar si una variable es nula, entonces podría terminar en un caso límite donde la variable no es nula sino booleana falsa
NikosDim
0
!members.find()

Creo que ahora la mejor manera de resolver este problema es el código anterior. Funciona desde Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find () . Ejemplos:

def lst1 = []
assert !lst1.find()

def lst2 = [null]
assert !lst2.find()

def lst3 = [null,2,null]
assert lst3.find()

def lst4 = [null,null,null]
assert !lst4.find()

def lst5 = [null, 0, 0.0, false, '', [], 42, 43]
assert lst5.find() == 42

def lst6 = null; 
assert !lst6.find()
Zhurov Konstantin
fuente
1
la colección que tiene 1 elemento nulo no está vacía, por lo que su sugerencia es incorrecta
Yura
1
¿Y si la colección es nula?
Dan Markhasin
1
def lst6 = nulo; afirmar! lst6.find () es correcto - no se produce ningún error
Zhurov Konstantin
0

Para su información, este tipo de código funciona (puede encontrarlo feo, es su derecho :)):

def list = null
list.each { println it }
soSomething()

En otras palabras, este código tiene cheques nulos / vacíos, ambos inútiles:

if (members && !members.empty) {
    members.each { doAnotherThing it }
}

def doAnotherThing(def member) {
  // Some work
}
Max
fuente