Best practice per convalidare la raccolta nulla e vuota in Java


211

Voglio verificare se una raccolta è vuota e null. Qualcuno potrebbe farmi sapere la migliore pratica.

Attualmente, sto controllando come di seguito:

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

10
A parte qualsiasi altra cosa, pensa al motivo per cui usi null == sampleMappiuttosto che sampleMap == null. La maggior parte delle persone trova il secondo più leggibile: il primo è un sostegno da altre lingue.
Jon Skeet,

6
A proposito, la raccolta nulla è cattiva. Se possibile, invece, svuota la raccolta. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
卢 声 远 Shengyuan Lu,

Le persone di @JonSkeet usano null == sampleMap nel caso in cui scrivano = anziché ==. se usi sampleMap == null, quando ne dimentichi uno =, diventa sampleMap = null, che non genererà errori, quindi scriverlo in altro modo aiuta lo sviluppatore a vederlo
Uri Loya,

1
@UriLoya: se scrivi if (null = sampleMap)in Java otterrai un errore di compilazione. Questo è esattamente il punto del mio primo commento. Il "motivo" per questo è specifico della lingua, ma è stato propagato ad altre lingue nonostante la penalità di leggibilità perché le persone non hanno considerato il motivo per cui lo stanno facendo.
Jon Skeet,

È possibile utilizzare la classe CollectionUtils che è presente nel pacchetto org.apache.commons.collections4.CollectionUtils. Esistono molti metodi di utilità per trovare vuoto o null.
vikash,

Risposte:


313

Se usi la libreria Collezioni di Apache Commons nel tuo progetto, puoi usare i metodi CollectionUtils.isEmptye MapUtils.isEmpty()che controllano rispettivamente se una collezione o una mappa è vuota o nulla (cioè sono "null-safe").

Il codice alla base di questi metodi è più o meno quello che l'utente @icza ha scritto nella sua risposta.

Indipendentemente da ciò che fai, ricorda che meno codice scrivi, meno codice devi testare man mano che la complessità del tuo codice diminuisce.


1
Grazie MapUtils.isEmpty è la soluzione perfetta per verificare che la mappa sia nulla o vuota
Narayan Yerrabachu

23
È un peccato che non vengano nominati isNullOrEmpty.
Scadge il

73

Questo è il modo migliore per verificarlo. È possibile scrivere un metodo di supporto per farlo:

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

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

Deve esserci anche una funzione simile per Map<?>.
Luiggi Mendoza,

1
Certo, puoi aggiungerne uno anche per le mappe, ma il titolo indicava la raccolta.
Icza,

1
Non capisco se m è null quindi .isEmpty () causerà rigidità NullPointerException? altrimenti, se il lato sinistro (m == null) è vero, il resto non verrà controllato
Ismail Sahin,

4
@ismail L' ||operatore è un operatore di corto circuito, nel senso che se l'operando di sinistra è true, non valuterà l'operando di destra. Quindi se m == null, allora m.isEmpty()non verrà chiamato (non necessario, il risultato è true).
Icza,

soluzione perfetta @icza
gaurav

32

Se si utilizzano i framework Spring, è possibile utilizzare CollectionUtilsper verificare sia le raccolte (elenco, array) che le mappe, ecc.

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

forse, parli di MapUtils.isEmpty () per Map, ma non per tutta la Collection?
Pavlo Chechehov,

21

Personalmente, preferisco usare raccolte vuote invece nullche far funzionare gli algoritmi in modo tale che per l'algoritmo non importa se la raccolta è vuota o meno.


10

Quando usi la primavera allora puoi usare

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

dove obj è qualsiasi [mappa, raccolta, matrice, aything ...]

altrimenti: il codice è:

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

per String best è:

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

3

Se è necessario verificare la presenza di null, questo è il modo. Tuttavia, se hai il controllo su questo, restituisci la raccolta vuota, ogni volta che puoi, e controlla solo per svuotare in seguito.

Questa discussione è più o meno la stessa cosa con C #, ma i principi si applicano ugualmente bene a Java. Come menzionato qui, null dovrebbe essere restituito solo se

  • null potrebbe significare qualcosa di più specifico;
  • la tua API (contratto) potrebbe costringerti a restituire null.

3

Puoi usare org.apache.commons.lang.Validateil metodo " notEmpty ":

Validate.notEmpty(myCollection)-> Convalida che la raccolta di argomenti specificata non è né nulla né una dimensione pari a zero (nessun elemento); altrimenti generando un'eccezione.


1

Verificheremo che un oggetto Collection è vuoto, nullo o no. questi tutti i metodi indicati di seguito sono presenti nel pacchetto org.apache.commons.collections4.CollectionUtils.

Controlla su Elenco o imposta il tipo di raccolta Oggetti.

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

Controlla il tipo di mappa degli oggetti.

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

Il tipo restituito di tutti i metodi è booleano.


-1

Per tutte le raccolte, inclusa la mappa, utilizzare: isEmptymetodo presente su questi oggetti della raccolta. Ma devi fare un controllo nullo prima di:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.