Existe-t-il une meilleure façon d'écrire ce chèque nul, et un chèque non vide, dans groovy?

101

Je dois effectuer une vérification nulle / vide sur un certain code, avant d'exécuter une logique. J'ai l'article ci-dessous, car je pense que ce !members?.emptyn'est pas correct.

Existe-t-il une manière plus géniale d'écrire ce qui suit?

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

Réponses:

209

Il existe en effet une voie plus Groovier.

if(members){
    //Some work
}

fait tout si membersc'est une collection. Contrôle nul et contrôle vide (les collections vides sont forcées false). Salut Groovy Truth . :)

dmahapatro
la source
3
Une manière plus "groovier" est que, par exemple, si vous êtes intéressé par l'âge maximum des membres, vous pouvez écrire ce qui suit: membres? .Age.max ()
BTakacs
9
Remarque: members?.age.max()explose avec "Impossible d'appeler la méthode max () sur un objet nul" lorsque les membres sont nuls. Vous auriez besoinmembers?.age?.max()
GreenGiant
@VinodJayachandran Yes
dmahapatro
2
non: la solution de GreenGiant est la meilleure: vérifiez List members = null;et comparez les List members = [ [age: 12], [age: 24], [age: null], null ]deux solutions
BTakacs
2
Ce type de vérification fonctionne dans la plupart des cas, mais si votre objectif est de vérifier si une variable est nulle, vous pourriez vous retrouver dans un cas de bord où la variable n'est pas nulle mais un booléen faux
NikosDim
0
!members.find()

Je pense que la meilleure façon de résoudre ce problème est maintenant le code ci-dessus. Cela fonctionne depuis Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find () . Exemples:

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
la source
1
la collection qui a 1 élément nul n'est pas vide, donc votre suggestion est erronée
Yura
1
Que faire si la collection est nulle?
Dan Markhasin
1
def lst6 = nul; assert! lst6.find () c'est correct - aucune erreur ne se produit
Zhurov Konstantin
0

Pour info ce genre de code fonctionne (vous pouvez le trouver moche, c'est votre droit :)):

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

En d'autres termes, ce code a des vérifications nulles / vides à la fois inutiles:

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

def doAnotherThing(def member) {
  // Some work
}
Max
la source