Meilleure pratique pour valider une collection nulle et vide en Java

211

Je veux vérifier si une collection est vide et null. Quelqu'un pourrait-il me faire part de la meilleure pratique?

Actuellement, je vérifie comme ci-dessous:

if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
} 
else {
  // do something else
}
user1635014
la source
10
Mis à part toute autre chose, pensez à pourquoi vous utilisez null == sampleMapplutôt que sampleMap == null. La plupart des gens trouvent ce dernier plus lisible - le premier est un résidu d'autres langues.
Jon Skeet
6
Soit dit en passant, la collection null est mauvaise. Si possible, rendez-la vide à la place. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
卢 声 远 Shengyuan Lu
Les gens @JonSkeet utilisent null == sampleMap au cas où ils écrivent = au lieu de ==. si vous utilisez sampleMap == null, lorsque vous oubliez one =, il devient sampleMap = null, ce qui ne générera pas d'erreur, l'écrire dans l'autre sens aide le développeur à le voir
Uri Loya
1
@UriLoya: Si vous écrivez if (null = sampleMap)en Java, vous obtiendrez une erreur de compilation. C'est précisément l'objet de mon premier commentaire. La «raison» de cela est spécifique à la langue, mais a été propagée à d'autres langues malgré la pénalité de lisibilité parce que les gens n'ont pas réfléchi à la raison pour laquelle ils le font.
Jon Skeet
Vous pouvez utiliser la classe CollectionUtils qui est présente dans le package org.apache.commons.collections4.CollectionUtils. Il existe de nombreuses méthodes utilitaires pour trouver vide ou null.
Vikash

Réponses:

313

Si vous utilisez la bibliothèque Apache Commons Collections dans votre projet, vous pouvez utiliser les méthodes CollectionUtils.isEmptyet MapUtils.isEmpty()qui vérifient respectivement si une collection ou une carte est vide ou nulle (c'est-à-dire qu'elles sont "null-safe").

Le code derrière ces méthodes est plus ou moins ce que l'utilisateur @icza a écrit dans sa réponse.

Peu importe ce que vous faites, n'oubliez pas que moins vous écrivez de code, moins vous devez tester de code à mesure que la complexité de votre code diminue.

Jalayn
la source
1
Merci MapUtils.isEmpty est la solution parfaite pour vérifier que la carte est nulle ou vide
Narayan Yerrabachu
23
Dommage qu'ils ne soient pas nommés isNullOrEmpty.
Scadge
73

C'est le meilleur moyen de le vérifier. Vous pouvez écrire une méthode d'aide pour le faire:

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

public static boolean isNullOrEmpty( final Map< ?, ? > m ) {
    return m == null || m.isEmpty();
}
icza
la source
Il doit également y avoir une fonction similaire Map<?>.
Luiggi Mendoza
1
Bien sûr, vous pouvez également en ajouter un pour les cartes, mais le titre indique la collection.
icza
1
Je ne comprends pas si m est nul alors .isEmpty () provoquera rigth NullPointerException? sinon, si le côté gauche (m == null) est vrai, le reste ne sera pas vérifié
Ismail Sahin
4
@ismail L' ||opérateur est un opérateur de court-circuit, ce qui signifie que si l'opérande de gauche l'est true, il n'évaluera pas l'opérande de droite. Donc, si m == null, alors m.isEmpty()ne sera pas appelé (pas nécessaire, le résultat est true).
icza
solution parfaite @icza
Gaurav
32

Si vous utilisez des frameworks Spring, vous pouvez utiliser CollectionUtilspour vérifier à la fois les collections (liste, tableau) et la carte, etc.

if(CollectionUtils.isEmpty(...)) {...}
Saorikido
la source
peut-être, vous parlez de MapUtils.isEmpty () pour Map, mais pas pour toutes les collections?
Pavlo Chechehov
21

Personnellement, je préfère utiliser des collections vides au lieu de nullet faire fonctionner les algorithmes de telle sorte que pour l'algorithme, peu importe si la collection est vide ou non.

tehlexx
la source
10

Lorsque vous utilisez le printemps, vous pouvez utiliser

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

où obj est n'importe quel [carte, collection, tableau, aything ...]

sinon: le code est:

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

pour String best est:

boolean isNullOrEmpty = (str==null || str.trim().isEmpty());
Dharmendrasinh Chudasama
la source
3

Si vous devez vérifier la valeur null, c'est le chemin. Cependant, si vous avez le contrôle, renvoyez simplement la collection vide, chaque fois que vous le pouvez, et ne vérifiez que la collection vide plus tard.

Ce fil est à peu près la même chose avec C #, mais les principes s'appliquent également à java. Comme mentionné ici, null ne doit être retourné que si

  • null pourrait signifier quelque chose de plus spécifique;
  • votre API (contrat) peut vous forcer à retourner null.
eis
la source
3

Vous pouvez utiliser org.apache.commons.lang.Validatela méthode " notEmpty " de:

Validate.notEmpty(myCollection)-> Valider que la collection d'arguments spécifiée n'est ni nulle ni une taille de zéro (aucun élément); sinon lever une exception.

Maria Ines Parnisari
la source
1

Nous vérifierons qu'un objet Collection est vide, nul ou non. ces toutes les méthodes qui sont données ci-dessous, sont présentes dans le package org.apache.commons.collections4.CollectionUtils.

Vérifier sur la liste ou définir le type d'objets de collection.

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

Vérifiez le type de carte des objets.

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

Le type de retour de toutes les méthodes est booléen.

vikash
la source
-1

Pour toutes les collections, y compris map use: isEmptymethod qui est là sur ces objets de collection. Mais vous devez faire une vérification nulle avant:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Nisar Adappadathil
la source