Czy jest lepszy sposób na zapisanie tego czeku zerowego i czeku niepustego w groovy?

101

Muszę sprawdzić wartość NULL / Empty na jakimś kodzie, zanim wykonam jakąś logikę. Mam pozycję poniżej, ponieważ czuję, że nie !members?.emptyjest poprawna.

Czy jest lepszy sposób na napisanie tego?

if (members && !members.empty) {
    // Some Work
}
Jay Bose
źródło

Odpowiedzi:

209

Naprawdę istnieje Groovier Way.

if(members){
    //Some work
}

robi wszystko, jeśli membersjest to zbiór. Czek zerowy i czek pusty (wymuszane są puste kolekcje false). Chwała Groovy Truth . :)

dmahapatro
źródło
3
Bardziej „groovier” sposób jest to, że na przykład, jeśli jesteś zainteresowany w wieku maksimum z członków następnie można napisać następujące: członkowie .age.max ()
BTakacs
9
Uwaga: members?.age.max()wyskakuje z komunikatem „Nie można wywołać metody max () na obiekcie o wartości null”, gdy składowe mają wartość null. Potrzebujeszmembers?.age?.max()
GreenGiant
@VinodJayachandran Yes
dmahapatro
2
nie: Rozwiązanie GreenGianta jest najlepsze: sprawdź List members = null;i List members = [ [age: 12], [age: 24], [age: null], null ]
porównuj
2
Ten typ sprawdzenia działa w większości przypadków, ale jeśli Twoim celem jest sprawdzenie, czy zmienna jest zerowa, możesz skończyć do przypadku
skrajnego, w
0
!members.find()

Myślę, że teraz najlepszym sposobem rozwiązania tego problemu jest powyższy kod. Działa od Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find () . Przykłady:

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
źródło
1
kolekcja, która ma 1 pusty element, nie jest pusta, więc Twoja sugestia jest błędna
Yura
1
Co się stanie, jeśli kolekcja jest zerowa?
Dan Markhasin
1
def lst6 = null; assert! lst6.find () jest poprawne - nie ma błędu
Zhurov Konstantin
0

FYI ten rodzaj kodu działa (możesz go uznać za brzydki, to twoje prawo :)):

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

Innymi słowy, ten kod ma zerowe / puste kontrole, które są zarówno bezużyteczne:

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

def doAnotherThing(def member) {
  // Some work
}
Maks
źródło