web-dev-qa-db-fra.com

Existe-t-il un moyen d’éviter les vérifications nulles avant le début de l’itération de boucle for-each?

Chaque fois que je dois parcourir une collection, je vérifie la valeur null, juste avant le début de l'itération de la boucle for-each. Comme ça:

if( list1 != null ){
    for(Object obj : list1){

    }
}

Y a-t-il un moyen plus court pour éviter d'écrire le bloc "if"? Note: J'utilise Java 5, et je resterai coincé dessus pendant un moment.

104
rk2010

Je suppose que la bonne réponse est la suivante: il n’ya aucun moyen de le raccourcir. Il existe certaines techniques telles que celles décrites dans les commentaires, mais je ne me vois pas les utiliser. Je pense qu'il vaut mieux écrire un bloc "if" que d'utiliser ces techniques. et oui .. avant que quiconque ne le mentionne encore :) "idéalement", le code devrait être conçu de telle sorte que la liste ne soit jamais une null

32
rk2010

Si possible, vous devez concevoir votre code de telle sorte que les collections ne soient pas null en premier lieu.

null les collections sont une mauvaise pratique (pour cette raison); vous devriez plutôt utiliser des collections vides. (par exemple, Collections.emptyList() )

Vous pouvez également créer une classe wrapper qui implémente Iterable, prend une collection et gère une collection null.
Vous pourriez alors écrire foreach(T obj : new Nullable<T>(list1))

79
SLaks
public <T extends Iterable> T nullGuard(T item) {
  if (item == null) {
    return Collections.EmptyList;
  } else {
    return item;
  }
}

vous permettrait d'écrire

for (Object obj : nullGuard(list)) {
  ...
}

Bien sûr, cela ne fait que déplacer la complexité ailleurs.

42
Edwin Buck

Nous sommes déjà en 2017 et vous pouvez maintenant utiliser Apache Commons Collections4

L'usage:

for(Object obj : CollectionUtils.emptyIfNull(list1)){
    // Do your stuff
}
19
Fred Pym

Dans Java 8, il existe une autre solution disponible en utilisant Java.util.Optional et la méthode ifPresent-.

Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));

Donc, pas une solution pour le problème exact mais c'est un oneliner et peut-être plus élégant.

16
wassgren

contrôle nul dans une boucle for améliorée

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

Alors utilisez:

for (Object object : emptyIfNull(someList)) { ... }
12
gavenkoa

Apache Commons

for (String code: ListUtils.emptyIfNull(codes)) {

}           

Google Guava

for (String code: Optional.of(codes).get()) {

}
10
Kerem Baydoğan

Combien de temps voulez-vous qu'il soit? C'est seulement 2 lignes supplémentaires ET c'est une logique claire et concise.

Je pense que la chose la plus importante dont vous avez besoin pour décider est de savoir si null est une valeur valide ou non. S'ils ne sont pas valides, vous devriez écrire votre code pour l'empêcher. Vous n’auriez alors pas besoin de ce genre de vérification. Si vous obtenez une exception en faisant une boucle foreach, c'est un signe qu'il y a un bogue ailleurs dans votre code.

7
unholysampler

1) si list1 est membre d'une classe, créez la liste dans le constructeur pour qu'elle soit là et non nulle bien que vide.

2) pour (Object obj: list1! = Null? List1: new ArrayList ())

5
Chris