Apakah ada cara yang lebih baik untuk menulis cek nol ini, dan cek tidak kosong, dengan asyik?

101

Saya perlu melakukan pemeriksaan null / kosong pada beberapa kode, sebelum melakukan beberapa logika. Saya memiliki item di bawah ini, karena saya merasa !members?.emptytidak benar.

Apakah ada cara yang lebih groovier untuk menulis yang berikut ini?

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

Jawaban:

209

Memang ada Cara Groovier.

if(members){
    //Some work
}

melakukan segalanya jika membersmerupakan sebuah koleksi. Cek kosong dan cek kosong (Koleksi kosong dipaksa false). Hail Groovy Truth . :)

dmahapatro.dll
sumber
3
Cara yang lebih "groovier" adalah misalnya jika Anda tertarik dengan usia maksimal dari anggota maka Anda dapat menulis yang berikut ini: members? .Age.max ()
BTakacs
9
Catatan: members?.age.max()meledak dengan "Tidak dapat memanggil metode max () pada objek null" ketika anggota adalah null. Anda akan membutuhkanmembers?.age?.max()
GreenGiant
@VinodJayachandran Ya
dmahapatro
2
no: Solusi GreenGiant adalah yang terbaik: periksa List members = null;dan List members = [ [age: 12], [age: 24], [age: null], null ]
bandingkan
2
Jenis pemeriksaan ini berfungsi untuk sebagian besar kasus tetapi jika tujuan Anda adalah untuk memeriksa apakah suatu variabel nol maka Anda mungkin berakhir dengan kasus tepi di mana variabel tidak null tetapi boolean false
NikosDim
0
!members.find()

Saya pikir sekarang cara terbaik untuk mengatasi masalah ini adalah kode di atas. Ia bekerja sejak Groovy 1.8.1 http://docs.groovy-lang.org/docs/next/html/groovy-jdk/java/util/Collection.html#find () . Contoh:

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
sumber
1
koleksi yang memiliki 1 elemen null tidak kosong, jadi saran Anda salah
Yura
1
Bagaimana jika koleksinya nol?
Dan Markhasin
1
def lst6 = nol; menegaskan! lst6.find () itu benar - tidak terjadi kesalahan
Zhurov Konstantin
0

FYI kode semacam ini berfungsi (Anda bisa menganggapnya jelek, itu hak Anda :)):

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

Dengan kata lain, kode ini memiliki nol / cek kosong keduanya tidak berguna:

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

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