Las mejores prácticas para validar la colección nula y vacía en Java


211

Quiero verificar si una colección está vacía y null. ¿Alguien podría decirme cuál es la mejor práctica?

Actualmente, estoy comprobando lo siguiente:

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

10
Aparte de cualquier otra cosa, piensa en qué se utiliza null == sampleMapen lugar de sampleMap == null. La mayoría de las personas encuentran que este último es más legible: el primero es un remanente de otros idiomas.
Jon Skeet

66
Por cierto, la colección nula es mala. Si es posible, conviértalo en una colección vacía. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
卢 声 远 Shengyuan Lu

@JonSkeet la gente usa null == sampleMap en caso de que escriban = en lugar de ==. si usa sampleMap == null, cuando olvida one =, se convierte en sampleMap = null, lo que no generará un error, por lo que escribirlo de otra manera ayuda al desarrollador a verlo
Uri Loya,

1
@UriLoya: Si escribe if (null = sampleMap)en Java, obtendrá un error de compilación. Ese es precisamente el punto de mi primer comentario. La "razón" es específica del idioma, pero se ha propagado a otros idiomas a pesar de la penalidad de legibilidad porque las personas no han considerado por qué lo hacen.
Jon Skeet

Puede usar la clase CollectionUtils que está presente en el paquete org.apache.commons.collections4.CollectionUtils. Hay muchos métodos de utilidad para encontrar vacíos o nulos.
vikash

Respuestas:


313

Si usa la biblioteca de Colecciones de Apache Commons en su proyecto, puede usar los métodos CollectionUtils.isEmptyy MapUtils.isEmpty()que verifican respectivamente si una colección o un mapa están vacíos o son nulos (es decir, son "nulos-seguros").

El código detrás de estos métodos es más o menos lo que el usuario @icza ha escrito en su respuesta.

Independientemente de lo que haga, recuerde que cuanto menos código escriba, menos código deberá probar a medida que disminuya la complejidad de su código.


1
Gracias MapUtils.isEmpty es solución perfecta para comprobar mapa es nulo o vacío
Narayan Yerrabachu

23
Es una pena que no se llamen isNullOrEmpty.
Scadge

73

Esa es la mejor manera de verificarlo. Podrías escribir un método auxiliar para hacerlo:

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

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

Debe haber una función similar para Map<?>también.
Luiggi Mendoza

1
Claro, también puede agregar uno para los mapas, pero el título indica la colección.
icza

1
No entiendo si m es nulo, entonces .isEmpty () causará NullPointerException rigth? de lo contrario, si el lado izquierdo (m == nulo) es verdadero, el resto no se verificará
Ismail Sahin

44
@ismail El ||operador es un operador de cortocircuito, lo que significa que si el operando izquierdo es true, no evaluará el operando derecho. Entonces m == null, si , entonces m.isEmpty()no se llamará (no es necesario, el resultado es true).
icza

impecable solución @icza
Gaurav

32

Si usa Spring frameworks, puede usar CollectionUtilspara verificar tanto en Colecciones (Lista, Array) como en Mapa, etc.

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

tal vez, ¿hablas de MapUtils.isEmpty () para Map, pero no para toda la Colección?
Pavlo Chechehov

21

Personalmente, prefiero usar colecciones vacías en lugar de nully hacer que los algoritmos funcionen de una manera que para el algoritmo no importe si la colección está vacía o no.


10

Cuando usas spring, entonces puedes usar

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

donde obj es cualquier [mapa, colección, matriz, algo ...]

de lo contrario: el código es:

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

para String best es:

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

3

Si necesita verificar nulo, ese es el camino. Sin embargo, si tiene control sobre esto, simplemente devuelva la colección vacía, siempre que pueda, y verifique solo si está vacía más adelante.

Este hilo es casi lo mismo con C #, pero los principios se aplican igualmente bien a Java. Como se mencionó allí, nulo debe devolverse solo si

  • nulo podría significar algo más específico;
  • su API (contrato) podría obligarlo a devolver nulo.

3

Puede usar org.apache.commons.lang.Validateel método " notEmpty ":

Validate.notEmpty(myCollection)-> Validar que la colección de argumentos especificada no es nula ni tiene un tamaño de cero (sin elementos); de lo contrario arrojando una excepción.


1

Verificaremos que un objeto Collection esté vacío, sea nulo o no. Estos todos los métodos que se dan a continuación están presentes en el paquete org.apache.commons.collections4.CollectionUtils.

Compruebe en Lista o establezca el tipo de objetos de colección.

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

Verifique el tipo de mapa de objetos.

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

El tipo de retorno de todos los métodos es booleano.


-1

Para todas las colecciones, incluido el uso de mapas: isEmptymétodo que existe en estos objetos de colección. Pero tienes que hacer una comprobación nula antes:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.