C'è un modo migliore per scrivere questo assegno nullo e un assegno non vuoto in groovy?


101

Devo eseguire un controllo null / vuoto su un codice, prima di eseguire un po 'di logica. Ho un elemento di seguito, perché ritengo !members?.emptynon corretto.

C'è un modo più divertente per scrivere quanto segue?

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

Risposte:


209

C'è davvero un modo Groovier.

if(members){
    //Some work
}

fa tutto se membersè una raccolta. Controllo nullo e controllo vuoto (le raccolte vuote sono obbligate a false). Hail Groovy Truth . :)


3
Un modo più "groovier" è che, ad esempio, se sei interessato all'età massima dei membri, puoi scrivere quanto segue: membri? .Age.max ()
BTakacs

9
Nota: members?.age.max()esplode con "Impossibile richiamare il metodo max () su oggetto nullo" quando i membri sono nulli. Avresti bisogno dimembers?.age?.max()
GreenGiant

@VinodJayachandran Sì
dmahapatro

2
no: la soluzione di GreenGiant è la migliore: controlla List members = null;e List members = [ [age: 12], [age: 24], [age: null], null ]contro entrambe le soluzioni
BTakacs

2
Questo tipo di controllo funziona per la maggior parte dei casi, ma se il tuo scopo è controllare se una variabile è nulla, potresti finire in un caso limite in cui la variabile non è nulla ma un falso booleano
NikosDim

0
!members.find()

Penso che ora il modo migliore per risolvere questo problema sia il codice sopra. Funziona da Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find () . Esempi:

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()

1
la raccolta che ha 1 elemento nullo non è vuota, quindi il tuo suggerimento è sbagliato
Yura

1
E se la raccolta fosse nulla?
Dan Markhasin

1
def lst6 = null; assert! lst6.find () è corretto - non si verificano errori
Zhurov Konstantin

0

Cordiali saluti, questo tipo di codice funziona (puoi trovarlo brutto, è un tuo diritto :)):

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

In altre parole, questo codice ha controlli nulli / vuoti entrambi inutili:

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

def doAnotherThing(def member) {
  // Some work
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.