web-dev-qa-db-fra.com

Comment vérifier si les listes d'une liste ne sont pas vides?

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?

18
helen

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.

20
Eugene

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.

9
Vladimir L.

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; }
6
Pritam Banerjee

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 }
5
Mark
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.

3
Ibtihaj Uddin

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.

2
HackerBoss