Java'da null ve boş koleksiyonu doğrulamak için en iyi uygulama


210

Bir koleksiyonun boş olup olmadığını doğrulamak istiyorum null. Herkes bana en iyi uygulamayı bilmeme izin verebilir mi?

Şu anda aşağıdaki gibi kontrol ediyorum:

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

10
Kenara Her şey bir yana, düşünmek neden kullanmak null == sampleMapyerine sampleMap == null. Çoğu insan ikincisini daha okunabilir buluyor - ilki diğer dillerden bir engel.
Jon Skeet

6
Bu arada, boş toplama kötü. Mümkünse, bunun yerine boş koleksiyon yapın. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
eng 声 远 Shengyuan Lu

@JonSkeet kullanıcıları == yerine = yazmaları durumunda null == sampleMap kullanır. sampleMap == null kullanırsanız, birini = unuttuğunuzda, sampleMap = null olur, bu da hatayı artırmaz, böylece başka bir şekilde yazmak geliştiricinin görmesine yardımcı olur
Uri Loya

1
@UriLoya: if (null = sampleMap)Java ile yazarsanız bir derleme hatası alırsınız. Bu tam olarak ilk yorumumun konusu. Bunun için "neden" dile özgüdür, ancak okunabilirlik cezasına rağmen diğer dillere de yayılmıştır, çünkü insanlar bunu neden yaptığını düşünmemiştir .
Jon Skeet

Org.apache.commons.collections4.CollectionUtils paketinde bulunan CollectionUtils sınıfını kullanabilirsiniz. Boş veya boş bulmak için birçok yardımcı yöntem vardır.
vikash

Yanıtlar:


313

Eğer kullanırsanız Apache Commons Koleksiyonları projenizde kütüphane, sen kullanabilir CollectionUtils.isEmptyve MapUtils.isEmpty()bir koleksiyon veya harita ise sırasıyla kontrol yöntemleri boş veya boş (bunlar "boş güvenli" bir başka deyişle).

Bu yöntemlerin ardındaki kod, user @icza'nın cevabında yazdığı şeydir.

Ne yaparsanız yapın, ne kadar az kod yazarsanız, kodunuzun karmaşıklığı azaldıkça test etmeniz gereken kodun o kadar az olduğunu unutmayın.


1
MapUtils.isEmpty, haritanın boş veya boş olduğunu kontrol etmek için mükemmel bir çözümdür
Narayan Yerrabachu

23
Onların isimlendirilmemesi üzücü isNullOrEmpty.
Scadge

73

Bunu kontrol etmenin en iyi yolu budur. Bunu yapmak için bir yardımcı yöntem yazabilirsiniz:

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

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

Benzer bir işlev de olmalı Map<?>.
Luiggi Mendoza

1
Elbette, haritalar için de bir tane ekleyebilirsiniz, ancak başlık koleksiyonu belirtti.
icza

1
M null sonra anlamıyorum .isEmpty () NullPointerException rigth neden olur? aksi takdirde, sol taraf (m == null) doğruysa, kalan kontrol edilmez
Ismail Sahin

4
@ismail ||Operatör kısa devre operatörüdür, yani sol işlenen ise true, sağ işlenen değerlendirilmez. Yani m == null, o m.isEmpty()zaman çağrılmayacaksa (gerekli değil, sonuç true).
icza

kusursuz bir çözüm @icza
gaurav

32

Spring çerçevelerini kullanıyorsanız CollectionUtils, hem Koleksiyonlara (Liste, Dizi) hem de Haritaya vb. Karşı kontrol etmek için kullanabilirsiniz .

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

Belki de MapUtils.isEmpty () 'dan bahsediyorsunuz, ama tüm koleksiyon için değil?
Pavlo Chechehov

21

Şahsen ben, yerine boş koleksiyonlar kullanmayı tercih ediyorum nullve algoritmalar için algoritma için koleksiyonun boş olup olmadığı önemli değil.


10

Yayı kullandığınızda

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

obj herhangi bir [harita, koleksiyon, dizi, aything ...]

aksi takdirde: kod:

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;
}

Dize için en iyisi:

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

3

Boş olup olmadığını kontrol etmeniz gerekiyorsa, işte bu yol. Bununla birlikte, bunun üzerinde kontrolünüz varsa, yapabildiğiniz zaman boş toplama geri dönün ve daha sonra sadece boş olup olmadığını kontrol edin.

Bu iş parçacığı C # ile aynı şeydir, ancak ilkeler java için de aynı derecede geçerlidir. Orada belirtildiği gibi, null değeri yalnızca

  • null daha spesifik bir şey anlamına gelebilir;
  • API'nız (sözleşmeniz) sizi null değerini döndürmeye zorlayabilir.

3

Sen kullanabilirsiniz org.apache.commons.lang.Validate'ın ' notEmpty ' yöntemi:

Validate.notEmpty(myCollection)-> Belirtilen bağımsız değişken koleksiyonunun null veya sıfır boyutunda olmadığını (öğe yok) doğrulayın; aksi takdirde bir istisna atar.


1

Bir Koleksiyon nesnesinin boş, boş olup olmadığını kontrol edeceğiz. aşağıda verilen tüm yöntemler org.apache.commons.collections4.CollectionUtils paketinde bulunmaktadır.

Liste Nesneleri'ni işaretleyin veya koleksiyon Nesnelerinin türünü ayarlayın.

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

Nesnelerin Harita türünü kontrol edin.

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

Tüm yöntemlerin dönüş türü boolean'dır.


-1

Harita koleksiyonu da dahil olmak üzere tüm koleksiyonlar için: isEmptyBu toplama nesnelerinde bulunan yöntem : Ama önce bir boş kontrol yapmanız gerekiyor:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.