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.