Есть ли лучший способ написать эту нулевую проверку и непустую проверку в Groovy?

102

Мне нужно выполнить нулевую / пустую проверку некоторого кода, прежде чем выполнять некоторую логику. У меня есть пункт ниже, потому что я считаю !members?.emptyнеправильным.

Есть ли более крутой способ написать следующее?

if (members && !members.empty) {
    // Some Work
}
Джей Боз
источник

Ответы:

211

Действительно отличный способ существует.

if(members){
    //Some work
}

делает все, если membersэто коллекция. Проверка на нуль, а также на пустую проверку (принудительно используются пустые коллекции false). Приветствую Groovy Truth . :)

Дмахапатро
источник
3
Более «крутой» способ заключается в том, что, например, если вас интересует максимальный возраст участников, вы можете написать следующее: members? .Age.max ()
BTakacs
9
Примечание: members?.age.max()взрывается сообщением «Невозможно вызвать метод max () для нулевого объекта», когда члены имеют значение NULL. Вам понадобитсяmembers?.age?.max()
GreenGiant
@VinodJayachandran Да
dmahapatro
2
нет: решение GreenGiant является лучшим: проверка List members = null;и List members = [ [age: 12], [age: 24], [age: null], null ]против обоих решения
BTakacs
2
Этот тип проверки работает в большинстве случаев, но если ваша цель состоит в том, чтобы проверить, имеет ли переменная значение NULL, вы можете
столкнуться с
0
!members.find()

Я думаю, что теперь лучший способ решить эту проблему - это код выше. Он работает с Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find () . Примеры:

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
коллекция, содержащая 1 нулевой элемент, не пуста, поэтому ваше предложение неверно
Юра
1
Что делать, если коллекция нулевая?
Дэн Мархасин
1
def lst6 = ноль; assert! lst6.find () это правильно - ошибки не возникает
Журов Константин
0

К вашему сведению, этот код работает (вы можете найти его уродливым, это ваше право :)):

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

Другими словами, этот код имеет нулевые / пустые проверки, которые бесполезны:

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

def doAnotherThing(def member) {
  // Some work
}
Максимум
источник