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.
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
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))
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.
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
}
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.
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)) { ... }
Apache Commons
for (String code: ListUtils.emptyIfNull(codes)) {
}
Google Guava
for (String code: Optional.of(codes).get()) {
}
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.
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 ())