Чи є кращий спосіб написати цей нульовий чек і не порожній чек в groovy?


101

Мені потрібно здійснити нульову / порожню перевірку деякого коду, перш ніж виконувати певну логіку. У мене є пункт нижче, тому що я вважаю, що !members?.emptyце не правильно.

Чи є більш грубий спосіб написати наступне?

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

Відповіді:


209

Дійсно є Гровійський шлях.

if(members){
    //Some work
}

робить усе, якщо membersце колекція. Нульовий чек, а також порожній чек (Порожні колекції примусові до false). Вітаю, Гроудова правда . :)


3
Більш "дорогий" спосіб полягає в тому, що, наприклад, якщо вас цікавить максимальний вік серед членів, ви можете написати наступне: members? .Age.max ()
BTakacs

9
Примітка: members?.age.max()вибухає з "Неможливо викликати метод max () на об’єкт null", коли члени є null. Вам знадобитьсяmembers?.age?.max()
GreenGiant

@VinodJayachandran Так
dmahapatro

2
ні: рішення GreenGiant найкраще: перевірити List members = null;і List members = [ [age: 12], [age: 24], [age: null], null ]проти обох рішень
BTakacs

2
Цей тип перевірки працює в більшості випадків, але якщо ваша мета - перевірити, чи змінна є нульовою, то ви можете виявити крайовий випадок, коли змінна не нульова, а булева
помилка

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 = null; аргумент! lst6.find () це правильно - помилки не виникає
Журов Костянтин

0

FYI цей код працює (ви можете вважати його некрасивим, це ваше право :)):

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

Іншими словами, цей код має нульові / порожні чеки і марними:

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

def doAnotherThing(def member) {
  // Some work
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.