Praktik terbaik untuk memvalidasi koleksi nol dan kosong di Jawa


211

Saya ingin memverifikasi apakah koleksi itu kosong dan null. Adakah yang bisa tolong beri tahu saya praktik terbaik.

Saat ini, saya memeriksa seperti di bawah ini:

if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
} 
else {
  // do something else
}

10
Selain hal lain, pikirkan mengapa Anda menggunakan null == sampleMapdaripada sampleMap == null. Kebanyakan orang menemukan yang terakhir lebih mudah dibaca - yang pertama adalah peninggalan dari bahasa lain.
Jon Skeet

6
Omong-omong, koleksi nol buruk. Jika mungkin, buat itu koleksi kosong sebagai gantinya. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
卢 声 远 Shengyuan Lu

@JonSkeet orang menggunakan null == sampleMap jika mereka menulis = bukan ==. jika Anda menggunakan sampleMap == null, ketika Anda lupa satu =, itu menjadi sampleMap = null, yang tidak akan menimbulkan kesalahan sehingga menuliskannya dengan cara lain membantu pengembang melihatnya
Uri Loya

1
@UriLoya: Jika Anda menulis if (null = sampleMap)di Jawa Anda akan mendapatkan kesalahan kompilasi. Itulah tepatnya komentar pertama saya. "Alasan" itu khusus bahasa, tetapi telah disebarluaskan ke bahasa lain meskipun ada hukuman keterbacaan karena orang belum mempertimbangkan mengapa mereka melakukan itu.
Jon Skeet

Anda dapat menggunakan kelas CollectionUtils yang hadir dalam paket org.apache.commons.collections4.CollectionUtils. Ada banyak metode utilitas untuk menemukan kosong atau nol.
vikash

Jawaban:


313

Jika Anda menggunakan pustaka Koleksi Apache Commons di proyek Anda, Anda dapat menggunakan CollectionUtils.isEmptydan MapUtils.isEmpty()metode yang masing-masing memeriksa apakah koleksi atau peta kosong atau nol (yaitu mereka "null-safe").

Kode di balik metode ini kurang lebih sama dengan yang ditulis oleh pengguna @icza dalam jawabannya.

Apa pun yang Anda lakukan, ingatlah bahwa semakin sedikit kode yang Anda tulis, semakin sedikit kode yang perlu Anda uji saat kompleksitas kode Anda berkurang.


1
Terima kasih MapUtils.isEmpty adalah solusi sempurna untuk memeriksa peta apakah nol atau kosong
Narayan Yerrabachu

23
Sayang sekali mereka tidak disebutkan namanya isNullOrEmpty.
Scadge

73

Itu cara terbaik untuk memeriksanya. Anda dapat menulis metode pembantu untuk melakukannya:

public static boolean isNullOrEmpty( final Collection< ? > c ) {
    return c == null || c.isEmpty();
}

public static boolean isNullOrEmpty( final Map< ?, ? > m ) {
    return m == null || m.isEmpty();
}

Harus ada fungsi serupa Map<?>juga.
Luiggi Mendoza

1
Tentu, Anda dapat menambahkan satu untuk peta juga, tetapi judulnya menyatakan koleksi.
icza

1
Saya tidak mengerti jika m adalah null maka .isEmpty () akan menyebabkan NullPointerException rigth? jika tidak, jika sisi kiri (m == null) benar maka sisanya tidak akan diperiksa
Ismail Sahin

4
@ismail ||Operator adalah operator hubung singkat, artinya jika operan kiri true, ia tidak akan mengevaluasi operan yang tepat. Jadi jika m == null, maka m.isEmpty()tidak akan dipanggil (tidak diperlukan, hasilnya true).
icza

solusi sempurna @icza
gaurav

32

Jika Anda menggunakan kerangka kerja Spring, maka Anda dapat menggunakan CollectionUtilsuntuk memeriksa terhadap kedua Koleksi (Daftar, Array) dan Peta dll.

if(CollectionUtils.isEmpty(...)) {...}

mungkin, Anda berbicara tentang MapUtils.isEmpty () untuk Map, tetapi tidak untuk semua Koleksi?
Pavlo Chechehov

21

Secara pribadi, saya lebih suka menggunakan koleksi kosong daripada nulldan memiliki algoritma bekerja sedemikian rupa sehingga untuk algoritma tidak masalah jika koleksi kosong atau tidak.


10

Saat Anda menggunakan pegas maka Anda bisa menggunakannya

boolean isNullOrEmpty = org.springframework.util.ObjectUtils.isEmpty(obj);

di mana obj adalah [peta, koleksi, array, aything ...]

jika tidak: kodenya adalah:

public static boolean isEmpty(Object[] array) {
    return (array == null || array.length == 0);
}

public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }

    if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    }
    if (obj instanceof CharSequence) {
        return ((CharSequence) obj).length() == 0;
    }
    if (obj instanceof Collection) {
        return ((Collection) obj).isEmpty();
    }
    if (obj instanceof Map) {
        return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

untuk String terbaik adalah:

boolean isNullOrEmpty = (str==null || str.trim().isEmpty());

3

Jika Anda perlu memeriksa nol, itulah caranya. Namun, jika Anda memiliki kendali atas ini, kembalikan saja koleksi yang kosong, kapan pun Anda bisa, dan periksa saja nanti yang kosong.

Utas ini kira-kira sama dengan C #, tetapi prinsip-prinsipnya berlaku juga untuk java. Seperti disebutkan di sana, null harus dikembalikan hanya jika

  • null mungkin berarti sesuatu yang lebih spesifik;
  • API (kontrak) Anda mungkin memaksa Anda untuk mengembalikan nol.

3

Anda dapat menggunakan org.apache.commons.lang.Validate' 's notEmpty metode':

Validate.notEmpty(myCollection)-> Validasi bahwa pengumpulan argumen yang ditentukan bukan nol atau ukuran nol (tanpa elemen); jika tidak melempar pengecualian.


1

Kami akan memeriksa objek Koleksi kosong, nol atau tidak. semua metode yang diberikan di bawah ini, hadir dalam paket org.apache.commons.collections4.CollectionUtils.

Periksa Daftar atau atur jenis Koleksi objek.

CollectionUtils.isEmpty(listObject);
CollectionUtils.isNotEmpty(listObject);

Periksa jenis Peta Objek.

MapUtils.isEmpty(mapObject);
MapUtils.isNotEmpty(mapObject);

Jenis pengembalian semua metode adalah boolean.


-1

Untuk semua koleksi termasuk peta gunakan: isEmptymetode yang ada di objek koleksi ini. Tetapi Anda harus melakukan pemeriksaan nol sebelum:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.