web-dev-qa-db-fra.com

Comment un pour chaque boucle se protège-t-il contre une liste vide?

J'ai lu http://www.leepoint.net/notes-Java/flow/loops/foreach.html . le pour chaque équivalent à

for (int i = 0; i < arr.length; i++) { 
     type var = arr[i];
      body-of-loop
}

est

for (type var : arr) {
      body-of-loop
}

Ma question est de savoir comment fonctionne une boucle pour chaque liste vide. Je sais que pour la boucle for régulière, la longueur arr.évaluera simplement à 0 et la boucle ne s'exécutera pas. Et pour chaque boucle?

26
committedandroider

Ma question est de savoir comment fonctionne une boucle pour chaque liste vide

ForEach fonctionne également de la même manière. Si la longueur est nulle, la boucle n'est jamais exécutée.

La seule différence entre eux est d'utiliser la boucle ForEach lorsque vous souhaitez itérer tous les éléments de la liste ou du tableau alors qu'en cas de boucle normale for, vous pouvez contrôler l'index de début et de fin.

29
Braj

Il utilise l'itérateur de la collection Iterable, par ex. Liste. Il est du devoir de l'implémenteur de l'itérateur d'écrire la méthode hasnext () pour retourner false s'il n'y a pas d'élément suivant ce qui sera le cas si la collection est vide

6
user3810043

Oui, c'est équivalent.

Si la liste est vide, le cycle for-each n'est pas exécuté une seule fois.

2
libik

Comme @ user3810043 y fait allusion dans leurs commentaires de réponse, l'instruction for améliorée est littéralement évaluée de la même manière qu'une instruction for de base équivalente:

14.14.2. L'amélioration pour la déclaration

...

Le type de l'expression doit être un sous-type du type brut Iterable ou un type tableau (§10.1), sinon une erreur de compilation se produit.

...

Sinon, l'expression a nécessairement un type de tableau, T [].

Soit L1 ... Lm la séquence (éventuellement vide) d'étiquettes précédant immédiatement l'instruction for améliorée.

L'instruction for améliorée équivaut à une instruction basic de la forme:

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}

#a et #i sont des identifiants générés automatiquement qui sont distincts de tous les autres identifiants (générés automatiquement ou non) qui sont dans la portée au point où l'instruction améliorée for se produit.

^ Citation de La spécification du langage Java®

0
Will Cain