J'ai un peu entendu parler d'itérateur J'étais conscient que c'était un mot lié au traitement itératif. Je n'étais pas sûr de ce que cela signifiait réellement, alors je l'ai recherché.
Même si je l'ai recherché avec le mot Iterator, il semblait être utilisé de multiples façons, et j'étais confus au début. En ce qui concerne le contexte Java, il semble être utilisé principalement dans les deux sens suivants.
** 1. Un modèle de conception défini par le livre du GoF qui fournit un moyen d'énumérer les objets conteneurs ** ** 2. Interface Iterator définie dans java.util.Iterator **
Tout d'abord, il existe un modèle de conception appelé Iterator * (1), L'interface Iterator * (2) l'incorpore dans les spécifications du langage Java.
Une fois que vous pouvez organiser cela, vous serez en mesure de comprendre quel sens il est utilisé à partir du contexte. La collecte d'informations est devenue beaucoup plus facile.
Selon le wiki, cela ressemble à ceci
En rendant indépendant les moyens d'énumération des éléments de l'objet conteneur Le but est de fournir des itérateurs qui ne dépendent pas des spécifications internes du conteneur.
Les termes techniques sont difficiles ... Je n'ai pas vraiment compris ce qu'était un conteneur, alors je suis allé sur le wiki.
Un conteneur est un terme général désignant des structures de données, des types de données abstraits ou des classes qui représentent une collection d'objets.
Vous pouvez lire le conteneur comme une collection ...? Essayer d'être bon, si vous traduisez à nouveau grossièrement le contenu du modèle Iterator du wiki
En définissant séparément le type de l'objet lui-même tel que List, array, MAP et la méthode de traitement itératif Vous pourrez itérer de la même manière, quel que soit le type de collection!
C'est comme ça?
Lors de l'utilisation des instructions étendues ou de l'API Stream, nous
list<string> hogelist = new arraylist<>();
Probablement
string[] hogelist = new string[2];
Ça n'a pas d'importance
for (String hoge : hogeList) { System.out.println(hoge); }
J'avais l'habitude de l'accrocher de la même manière quel que soit le moule. C'est parce que l'implémentation basée sur le modèle Iterator est en fait définie de sorte que vous n'ayez pas à en être conscient! Je veux dire ...!
Ainsi, l'interface Iterator sort. À première vue, ce qui est défini à l'endroit où vous n'avez pas à en être conscient! ?? C'est L ' objet de collection </ b> implémente l' interface Iterator </ b>.
Comme vous l'avez souligné dans les commentaires, pour être précis Par l ' interface Iterable </ b> implémentée par l' objet de collection </ b> Vous pouvez appeler l ' interface Iterator </ b>! Il semble.
… Si vous étudiez seul, vous ne remarquerez aucun malentendu et évoluerez vers le cancer. Je suis vraiment reconnaissant pour vos suggestions, merci ...!
La méthode de l'interface Iterator ressemble à ceci.
Type de retour | Méthode | La description |
---|---|---|
boolean | hasNext( ) | Renvoie true si les éléments suivants sont présents dans le processus itératif. |
Object | next( ) | Renvoie l'élément suivant du processus itératif. |
void | remove( ) | Supprime le dernier élément appelé dans le processus itératif. |
L'interface Iterable ressemble à ceci
Type de retour | Méthode | La description |
---|---|---|
void | forEach(Consumer<? super T> action) | Exécute l'action spécifiée pour chaque élément de Iterable jusqu'à ce que tous les éléments soient traités ou que l'action lève une exception. |
Iterator |
iterator() | Renvoie un itérateur pour un élément de type T. |
Spliterator |
spliterator() | Créez un Spliterator pour les éléments décrits par cet Iterable. |
… C'est un peu intéressant car l'explication sur le site officiel est comme l'explication d'un jeu de cartes ↓
L'implémentation de cette interface permet aux objets d'être la cible d'instructions "for-each loop".
for-each loop = étendu pour l'instruction.
Organiser, Une collection telle que List et MAP définit la nature de la collection L'interface Iterator définit comment itérer Vous pouvez appeler l'interface Iterator en implémentant l'interface Iterable dans la collection.
List et MAP, tant que la collection implémente l'interface Iterable Vous pouvez obtenir l'interface Iterator Par conséquent, quel que soit le type de collection, si vous implémentez l'interface Iterable, vous pouvez implémenter un traitement itératif.
Et je vous l'ai aussi dit dans les commentaires Le tableau n'implémente pas l'interface Iterable ...! Je ne l'ai pas fait, mais il semble qu'Extended for-kun traite uniquement le tableau spécialement et l'interprète comme une instruction for normale.
HasNext () et remove () lors de l'utilisation de l'extension pour et StreamAPI Je ne me souviens pas l'avoir vu, c'est juste inconnu.
C'est parce que Java-san fait secrètement ceci et cela. Merci d'avoir rendu la grue, je veux regarder de l'autre côté du shoji ... et je veux être convaincu ... Une personne a compilé et décrit le traitement interne de l'instruction FOR étendue.
Le code publié ici est cité ci-dessous.
import java.util.ArrayList;
import java.util.List;
public class IteratorSample3 {
public static void main(String[] args) {
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add(new Integer(i));
}
for (Object o : list) {
System.out.println((Integer)o);
}
}
}
↓
import java.io.PrintStream;
import java.util.*;
public class IteratorSample3
{
public IteratorSample3()
{
}
public static void main(String args[])
{
ArrayList arraylist = new ArrayList();
for(int i = 0; i < 10; i++)
arraylist.add(new Integer(i));
Object obj;
for(Iterator iterator = arraylist.iterator();
iterator.hasNext();
System.out.println((Integer)obj))
obj = iterator.next();
}
}
public class IteratorSample5 {
public static void main(String[] args) {
int[] numbers = new int[10];
for (int i = 0; i < 10; i++) {
numbers[i] = i;
}
for (int i : numbers) {
System.out.println(i);
}
}
}
↓
import java.io.PrintStream;
public class IteratorSample5
{
public IteratorSample5()
{
}
public static void main(String args[])
{
int ai[] = new int[10];
for(int i = 0; i < 10; i++)
ai[i] = i;
int ai1[] = ai;
int j = ai1.length;
for(int k = 0; k < j; k++)
{
int l = ai1[k];
System.out.println(l);
}
}
}
Dans le cas des tableaux, l'accès se faisait à l'aide d'un index très ordinaire. Il semble que la méthode de conversion soit modifiée en regardant l'autre partie.
S'il s'agit d'un objet de collection, traitement d'itération à l'aide d'itérateur S'il s'agit d'un tableau, le compilateur décide vraiment d'utiliser un for normal comme sucre de syntaxe ...! Je ne pouvais pas savoir si j'étais seul. Je suis vraiment reconnaissant à quelqu'un avec des compétences exploratoires et techniques de divulguer ses connaissances ...
Jusqu'à présent, Java ... ou plutôt, en utilisant l'instruction FOR étendue sur le modèle Iterator et la méthode Iterator Au moment où j'écrivais, ce n'était en fait que la moitié de l'explication de l'itérateur appelé "itérateur externe" ...!
Récemment ... je ne l'ai plus du tout, mais l'API Stream que Java8 a commencé à utiliser! Il semble que l'autre moitié de l'itérateur, «l'itérateur interne», puisse être implémentée ...!
Avec ce sentiment, je suis épuisé, alors je vais le publier ici. Bien qu'il soit appelé un itérateur externe, il est actuellement expliqué comme une extension pour, donc je l'ajouterai plus tard ...
Organisez le japonais et la structure des phrases, et si vous mentez, corrigez le contenu Comme (2), j'écrirai un résumé de l'étude des itérateurs externes dans un proche avenir. … Il est difficile d'en faire un article.
Traitement parallèle fermeture Itérateur interne
Repenser: modèle de conception GoF
Java Iterator (Extended for Syntax)
Interface Iterator
Recommended Posts