J'ai une liste de listes en Java. Voici le code:
List<List<Integer>> myList = new ArrayList<>();
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());
myList.get(0).add(1);
myList.get(0).add(2);
myList.get(0).add(3);
myList.get(1).add(4);
myList.get(1).add(5);
myList.get(1).add(6);
myList.get(2).add(7);
myList.get(2).add(8);
myList.get(2).add(9);
Maintenant, dans une partie de mon code, je veux vérifier si les trois listes situées dans myList
ne sont pas vides et nulles. Dois-je vérifier chacune de ces listes une par une, comme ceci:
if (myList.get(0) != null && !myList.get(0).isEmpty()) {
// do something
}
... ou existe-t-il une façon plus efficace et plus courte de procéder au lieu de vérifier un par un?
Vous pouvez utiliser l'API Stream pour cela, mais aussi une boucle simple aussi:
boolean allNonEmptyOrNull = myList.stream()
.allMatch(x -> x != null && !x.isEmpty());
Ou vous pouvez vérifier si null
est contenu ou un List
vide par exemple, via:
System.out.println(myList.contains(null) || myList.contains(Collections.<Integer> emptyList()));
Mais cette dernière option rompra avec Java 9 collections immuables, par exemple:
List.of(1, 2, 3).contains(null);
va lancer un NullPointerException
.
Utiliser Java 7 et ci-dessous c'est la façon classique d'aborder cela:
for (List<Integer> list : myList) {
if (list != null && !list.isEmpty()) {
// do something with not empty list
}
}
Avec Java 8 et supérieur, vous pouvez utiliser forEach
:
myList.forEach(list -> {
if (list != null && !list.isEmpty()) {
// do something with not empty list
}
});
ou, comme déjà mentionné par Eugene , avec l'API stream, vous pouvez remplacer l'instruction if
par l'expression lambda:
myList.stream()
.filter(list -> (list != null && !list.isEmpty()))
.forEach(list -> {
// do something with not empty list
});
Remarque: tous ces 3 exemples impliquent que vous avez initialisé la variable myList
et que ce n'est pas null
, sinon NullPointerException
sera jeté dans tous les extraits ci-dessus.
Le JDK standard n'a pas de moyen rapide de vérifier que la collection n'est pas nulle et non vide. Mais si vous utilisez Apache commons-collections
bibliothèque, ils proposent une telle méthode: CollectionUtils.isNotEmpty () . Cependant, je ne recommanderais pas d'ajouter cette dépendance dans votre projet juste pour le plaisir de cette fonction unique.
Vous pouvez faire quelque chose comme ça:
boolean isEmpty = false;
for(List<Integer> list : myList) {
if(list == null || list.isEmpty()) {
isEmpty = true;
break;
}
}
if(!isEmpty) { // do your thing; }
Vérifiez simplement que votre collection ne contient pas de liste vide
if (!L.contains(Collections.EMPTY_LIST)){ do something }
ou chèque vide et nul (attention à NullPointerException !!!)
if (!L.contains(Collections.EMPTY_LIST) && !L.contains(null)){ do something }
int temp = 0;
for(int i=0;i<L.size();i++) {
if (L.get(i).isEmpty()) {
temp++;
}
}
if (temp == L.size()) {
//do what you want, all the lists inside L are empty
}
C'est tout ce à quoi je peux penser en ce moment.
J'utiliserais une boucle Java foreach
. Elle est similaire au bouclage par index, mais elle est plus agréable à lire et est un peu plus courte.
boolean nonempty = true;
for (List<Integer> list : myList) {
if (list == null || list.isEmpty()) {
nonempty = false;
break;
}
}
Cela vous permet également de sortir tôt si vous trouvez une liste vide.