Existe uma maneira melhor de escrever esse cheque nulo, e um cheque não vazio, no groovy?

101

Preciso realizar uma verificação nula / vazia em algum código, antes de realizar alguma lógica. Eu tenho item abaixo, porque eu sinto!members?.empty não é correto.

Existe uma maneira melhor de escrever o seguinte?

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

Respostas:

209

Existe, de fato, um Caminho Groovier.

if(members){
    //Some work
}

faz tudo se membersfor uma coleção. Verificação nula, bem como verificação vazia (coleções vazias são forçadas false). Hail Groovy Truth . :)

dmahapatro
fonte
3
Uma maneira mais "groovier" é, por exemplo, se você estiver interessado na idade máxima dos membros, você pode escrever o seguinte: members? .Age.max ()
BTakacs
9
Nota: members?.age.max()explode com "Não é possível invocar o método max () no objeto nulo" quando os membros são nulos. Você precisariamembers?.age?.max()
GreenGiant
@VinodJayachandran Sim
dmahapatro
2
não: a solução da GreenGiant é a melhor: compare List members = null;e compare as List members = [ [age: 12], [age: 24], [age: null], null ]duas soluções
BTakacs
2
Este tipo de verificação está funcionando para a maioria dos casos, mas se o seu propósito é verificar se uma variável é nula, então você pode acabar em um caso extremo em que a variável não é nula, mas um falso booleano
NikosDim
0
!members.find()

Acho que agora a melhor maneira de resolver esse problema é o código acima. Funciona desde Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find () . Exemplos:

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
fonte
1
a coleção que tem 1 elemento nulo não está vazia, então sua sugestão está errada
Yura
1
E se a coleção for nula?
Dan Markhasin
1
def lst6 = nulo; assert! lst6.find () está correto - nenhum erro ocorre
Zhurov Konstantin
0

Para sua informação, esse tipo de código funciona (você pode achar que é feio, está certo :)):

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

Em outras palavras, este código tem verificações nulas / vazias, ambas inúteis:

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

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