Prática recomendada para validar a coleção nula e vazia em Java


211

Quero verificar se uma coleção está vazia e null. Alguém poderia me informar sobre as melhores práticas.

Atualmente, estou verificando como abaixo:

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

10
Além de qualquer outra coisa, pense por que você usa null == sampleMape não sampleMap == null. A maioria das pessoas considera o último mais legível - o primeiro é um resquício de outras línguas.
9138 Jon Skeet #

6
A propósito, a coleção nula é ruim. Se possível, faça uma coleção vazia. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
远 声 远 Shengyuan Lu 23/12/2015

As pessoas do @JonSkeet usam null == sampleMap no caso de escreverem = em vez de ==. se você usar sampleMap == null, quando você esquecer um =, torna-se sampleMap = null, que vai escrever não erro raise, assim, para o outro lado ajuda o desenvolvedor vê-lo
Uri Loya

1
@UriLoya: Se você escrever if (null = sampleMap)em Java, receberá um erro de compilação. Esse é precisamente o objetivo do meu primeiro comentário. A "razão" para isso é específica do idioma, mas foi propagada para outros idiomas, apesar da penalidade de legibilidade, porque as pessoas não consideraram o porquê disso.
Jon Skeet

Você pode usar a classe CollectionUtils, presente no pacote org.apache.commons.collections4.CollectionUtils. Existem muitos métodos utilitários para encontrar vazio ou nulo.
vikash 18/03

Respostas:


313

Se você usar a biblioteca Apache Commons Collections em seu projeto, poderá usar os métodos CollectionUtils.isEmptye MapUtils.isEmpty()que, respectivamente, verificam se uma coleção ou um mapa está vazio ou nulo (ou seja, eles são "seguros para nulos").

O código por trás desses métodos é mais ou menos o que o usuário @icza escreveu em sua resposta.

Independentemente do que você faz, lembre-se de que quanto menos código você escreve, menos código você precisa testar à medida que a complexidade do seu código diminui.


1
Graças MapUtils.isEmpty é solução perfeita para verificar mapa é nulo ou vazio
Narayan Yerrabachu

23
É uma pena que não tenham nome isNullOrEmpty.
Scadge

73

Essa é a melhor maneira de verificar isso. Você pode escrever um método auxiliar para fazer isso:

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

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

Também deve haver uma função semelhante Map<?>.
Luiggi Mendoza

1
Claro, você também pode adicionar um para mapas, mas o título indica a coleção.
icza 4/10/12

1
Eu não entendo se m é nulo, então .isEmpty () causará NullPointerException rigth? caso contrário, se o lado esquerdo (m == null) for verdadeiro, o restante não será verificado
Ismail Sahin

4
@ismail O ||operador é um operador de curto-circuito, ou seja, se o operando esquerdo estiver true, ele não avaliará o operando direito. Portanto m == null, m.isEmpty()se não for chamado (não é necessário, o resultado é true).
icza 29/07

impecável solução @icza
gaurav

32

Se você usa estruturas Spring, pode usar CollectionUtilspara verificar as coleções (lista, matriz) e mapa etc.

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

talvez você fale sobre MapUtils.isEmpty () para Map, mas não para toda a coleção?
Pavlo Chechehov

21

Pessoalmente, prefiro usar coleções vazias em vez de nullfazer com que os algoritmos funcionem de uma maneira que, para o algoritmo, não importa se a coleção está vazia ou não.


10

Quando você usa a primavera, pode usar

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

onde obj é qualquer [mapa, coleção, array, tudo ...]

caso contrário: o código é:

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 melhor é:

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

3

Se você precisar procurar nulo, é esse o caminho. No entanto, se você tiver controle sobre isso, basta retornar a coleção vazia, sempre que puder, e verificar apenas a vazio posteriormente.

Esse encadeamento é quase o mesmo com o C #, mas os princípios se aplicam igualmente ao java. Como mencionado, null deve ser retornado apenas se

  • null pode significar algo mais específico;
  • sua API (contrato) pode forçar você a retornar nulo.

3

Você pode usar org.apache.commons.lang.Validateo método " notEmpty ":

Validate.notEmpty(myCollection)-> Valide que a coleção de argumentos especificada não é nula nem tem tamanho zero (sem elementos); caso contrário, lançando uma exceção.


1

Verificaremos se um objeto de coleção está vazio, nulo ou não. todos esses métodos fornecidos abaixo estão presentes no pacote org.apache.commons.collections4.CollectionUtils.

Verifique na lista ou defina o tipo de coleção de objetos.

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

Verifique no tipo de mapa objetos.

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

O tipo de retorno de todos os métodos é booleano.


-1

Para todas as coleções, incluindo map use: isEmptymethod, que existe nesses objetos de coleção. Mas você precisa fazer uma verificação nula antes:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.