Ich habe ein wenig über Iterator gehört Mir war bewusst, dass es sich um ein Wort handelte, das sich auf die iterative Verarbeitung bezog. Ich war mir nicht sicher, was es eigentlich bedeutete, also habe ich es nachgeschlagen.
Selbst wenn ich es mit dem Wort Iterator nachschlug, schien es in mehreren Bedeutungen verwendet zu werden, und ich war zuerst verwirrt. Was den Java-Kontext betrifft, so scheint er hauptsächlich in den folgenden zwei Bedeutungen verwendet zu werden.
** 1. Ein im GoF-Buch definiertes Entwurfsmuster, mit dem Containerobjekte aufgelistet werden können ** ** 2. In java.util.Iterator definierte Iterator-Schnittstelle **
Zunächst gibt es ein Entwurfsmuster namens Iterator * (1). Die Iterator-Schnittstelle * (2) nimmt dies in die Java-Sprachspezifikationen auf.
Sobald Sie dies organisieren können, können Sie verstehen, welche Bedeutung es aus dem Kontext verwendet wird. Das Sammeln von Informationen ist viel einfacher geworden.
Laut Wiki sieht es so aus
Indem Sie die Mittel zum Aufzählen der Elemente des Containerobjekts unabhängig machen Der Zweck besteht darin, Iteratoren bereitzustellen, die nicht von den internen Spezifikationen des Containers abhängen.
Fachbegriffe sind schwierig ... Ich habe nicht wirklich verstanden, was ein Container ist, also bin ich ins Wiki gegangen.
Ein Container ist ein allgemeiner Begriff für Datenstrukturen, abstrakte Datentypen oder Klassen, die eine Sammlung von Objekten darstellen.
Sie können den Container als Sammlung lesen ...? Ich versuche gut zu sein, wenn Sie den Inhalt des Iterator-Musters des Wikis erneut grob übersetzen
Indem Sie den Typ des Objekts selbst wie Liste, Array, MAP und die iterative Verarbeitungsmethode separat definieren Sie können unabhängig von der Art der Sammlung auf dieselbe Weise iterieren!
Ist es so
Bei Verwendung von Extended for Statements oder Stream API verwenden wir
list<string> hogelist = new arraylist<>();
Wahrscheinlich
string[] hogelist = new string[2];
Es spielt keine Rolle
for (String hoge : hogeList) { System.out.println(hoge); }
Ich habe es immer auf die gleiche Weise aufgehängt, unabhängig von der Form. Dies liegt daran, dass die Implementierung basierend auf dem Iterator-Muster tatsächlich definiert ist, sodass Sie sich dessen nicht bewusst sein müssen! Ich meine ...!
So kommt die Iterator-Schnittstelle heraus. Was ist auf den ersten Blick an dem Ort definiert, an dem Sie sich dessen nicht bewusst sein müssen! ?? Das ist Das Sammlungsobjekt </ b> implementiert die Iterator-Schnittstelle </ b>.
Wie Sie in den Kommentaren betont haben, um genau zu sein Durch die iterierbare Schnittstelle </ b>, die vom Sammlungsobjekt </ b> implementiert wird Sie können die Iterator-Schnittstelle </ b> aufrufen! Es scheint.
… Wenn Sie alleine studieren, werden Sie keine Missverständnisse bemerken und sich zu Krebs entwickeln. Ich bin sehr dankbar für Ihre Vorschläge, danke ...!
Die Methode der Iterator-Schnittstelle sieht folgendermaßen aus.
Rückgabetyp | Methode | Erläuterung |
---|---|---|
boolean | hasNext( ) | Gibt true zurück, wenn die folgenden Elemente im iterativen Prozess vorhanden sind. |
Object | next( ) | Gibt das nächste Element im iterativen Prozess zurück. |
void | remove( ) | Löscht das letzte im iterativen Prozess aufgerufene Element. |
Die Iterable-Oberfläche sieht so aus
Rückgabetyp | Methode | Erläuterung |
---|---|---|
void | forEach(Consumer<? super T> action) | Führt die für jedes Element von Iterable angegebene Aktion aus, bis alle Elemente verarbeitet wurden oder die Aktion eine Ausnahme auslöst. |
Iterator |
iterator() | Gibt einen Iterator für ein Element vom Typ T zurück. |
Spliterator |
spliterator() | Erstellen Sie einen Spliterator für die von dieser Iterable beschriebenen Elemente. |
… Das ist ein bisschen interessant, weil die Erklärung auf der offiziellen Website der Erklärung für ein Kartenspiel entspricht ↓
Durch die Implementierung dieser Schnittstelle können Objekte das Ziel von "for-each-loop" -Anweisungen sein.
for-each-Schleife = erweitert für Anweisung.
Organisieren, Sammlungen wie List und MAP definieren die Art der Sammlung Die Iterator-Schnittstelle definiert, wie iteriert werden soll Sie können die Iterator-Schnittstelle aufrufen, indem Sie die Iterable-Schnittstelle in der Sammlung implementieren.
Sowohl List als auch MAP, solange die Sammlung die Iterable-Schnittstelle implementiert Sie können die Iterator-Schnittstelle erhalten Unabhängig von der Art der Sammlung können Sie daher die iterative Verarbeitung implementieren, wenn Sie die Iterable-Schnittstelle implementieren.
Und das habe ich dir auch in den Kommentaren gesagt Das Array implementiert die Iterable-Schnittstelle nicht ...! Ich habe das nicht getan, aber es scheint, dass Extended for-kun nur das Array speziell behandelt und es als normale for-Anweisung interpretiert.
HasNext () und remove (), wenn die Erweiterung für und StreamAPI tatsächlich verwendet wird Ich erinnere mich nicht, es gesehen zu haben, es ist einfach ungewohnt.
Das liegt daran, dass Java-san dies und das heimlich tut. Vielen Dank, dass Sie den Kran zurückgegeben haben. Ich möchte auf die andere Seite des Shoji schauen ... und ich möchte überzeugt sein ... Es gab eine Person, die die interne Verarbeitung der erweiterten FOR-Anweisung rückwärts kompilierte und beschrieb.
Der hier veröffentlichte Code (http://www.javainthebox.net/laboratory/J2SE1.5/LangSpec/ExtendedFor/ExtendedFor.html) ist unten angegeben.
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);
}
}
}
Bei Arrays erfolgte der Zugriff über einen ganz normalen Index. Es scheint, dass die Konvertierungsmethode durch einen Blick auf die andere Partei geändert wird.
Wenn es sich um ein Sammlungsobjekt handelt, wird die Iteration mit Iterator verarbeitet Wenn es sich um ein Array handelt, entscheidet sich der Compiler wirklich dafür, einen Normalwert als Syntaxzucker zu verwenden ...! Ich konnte nicht herausfinden, ob ich alleine war. Ich bin wirklich dankbar, dass jemand mit explorativen und technischen Fähigkeiten sein Wissen preisgibt ...
Bisher Java ... oder besser gesagt, mit der erweiterten FOR-Anweisung über das Iterator-Muster und die Iterator-Methode Während ich schrieb, war dies eigentlich nur die halbe Erklärung des Iterators "externer Iterator" ...!
Vor kurzem ... Ich habe es überhaupt nicht mehr, aber die Stream-API, die Java8 zu verwenden begann! Es scheint, dass die andere Hälfte des Iterators, der "interne Iterator", implementiert werden kann ...!
Mit diesem Gefühl bin ich erschöpft und werde es hier veröffentlichen. Obwohl es als externer Iterator bezeichnet wird, wird es fast als Erweiterung für erklärt, daher werde ich es später hinzufügen ...
Organisieren Sie die japanische und Satzstruktur und korrigieren Sie den Inhalt, wenn Sie lügen Als (2) werde ich in naher Zukunft eine Zusammenfassung des Studiums externer Iteratoren schreiben. … Es ist schwer, daraus einen Artikel zu machen.
Parallelverarbeitung Schließung Interner Iterator
Überdenken: GoF-Entwurfsmuster
Java Iterator (erweitert für Syntax)
Interface Iterator
Recommended Posts