Mejores prácticas para validar una colección nula y vacía en Java

4 minutos de lectura

avatar de usuario
srk

Quiero verificar si una colección está vacía y null. ¿Podría alguien decirme la mejor práctica?

Actualmente, estoy comprobando lo siguiente:

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

  • Aparte de cualquier otra cosa, piensa en por qué tu usas null == sampleMap más bien que sampleMap == null. La mayoría de la gente encuentra este último más legible; el primero es un vestigio de otros idiomas.

    – Jon Skeet

    4 de octubre de 2012 a las 6:03

  • Por cierto, la colección nula es mala. Si es posible, haz que sea una colección vacía en su lugar. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.

    – 卢声远 Shengyuan Lu

    23 de diciembre de 2015 a las 4:56


  • La gente de @JonSkeet usa null == sampleMap en caso de que escriba = en lugar de ==. si usa sampleMap == null, cuando olvida uno =, 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

    14 de noviembre de 2019 a las 14:39


  • @UriLoya: Si escribes if (null = sampleMap) en Java obtendrá un error de compilación. Ese es precisamente el punto de mi primer comentario. La “razón” de esto es específica del idioma, pero se ha propagado a otros idiomas a pesar de la penalización de legibilidad porque las personas no han considerado por qué están haciendo eso.

    – Jon Skeet

    14 de noviembre de 2019 a las 14:41

  • 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

    18 de marzo de 2020 a las 10:14

avatar de usuario
Jalayn

Si usas el Colecciones Apache Commons biblioteca en su proyecto, puede utilizar la CollectionUtils.isEmpty y MapUtils.isEmpty() métodos que verifican respectivamente si una colección o un mapa es vacío o nulo (es decir, son “a prueba de nulos”).

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 necesitará probar a medida que la complejidad de su código disminuya.

avatar de usuario
icza

Esa es la mejor manera de comprobarlo. 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

    4 de octubre de 2012 a las 5:59


  • Claro, también puede agregar uno para mapas, pero el título indica colección.

    – icza

    4 de octubre de 2012 a las 6:06

  • No entiendo si m es nulo, entonces .isEmpty() causará NullPointerException ¿verdad? de lo contrario, si el lado izquierdo (m==null) es verdadero, el resto no se verificará

    – Ismail Sahin

    29 de julio de 2016 a las 8:46


  • @ismail El || operador es un operador de cortocircuito, lo que significa que si el operando izquierdo es true, no evaluará el operando correcto. Así que si m == nulldespués m.isEmpty() no será llamado (no es necesario, el resultado es true).

    – icza

    29 de julio de 2016 a las 9:05

Si usa marcos Spring, entonces puede usar CollectionUtils para verificar tanto las Colecciones (Lista, Matriz) como el Mapa, etc.

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

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

avatar de usuario
Dharmendrasinh Chudasama

Cuando usas primavera, entonces puedes usar

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

donde obj es cualquier [map,collection,array,aything…]

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 mejor es:

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

Verificaremos que un objeto Collection esté vacío, sea nulo o no. todos estos 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.

avatar de usuario
María Inés Parnisari

Puedes usar org.apache.commons.lang.Validate‘s “no vacío” método:

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

  • Esta es una buena alternativa para validaciones de parámetros ya que CollectionUtils.isEmpty(...) no está presente en versiones anteriores de la biblioteca. sin embargo, el Validate.notEmpty(...) El método lanza una excepción cuando está vacío. En @srk, el escenario no funcionará si creemos que usar una excepción es malo para el control de flujo. web.archive.org/web/20140430044213/http://c2.com/cgi-bin/…

    – Jefre

    22 de julio a las 20:25

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad