Java und Iterator Teil 1 Externe Iterator Edition

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.

Zuerst ...

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.

Was ist das Iteratormuster?

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 ...!

Iterator-Schnittstelle

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.

Java-Iteration und Iterator-Methode

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.

Für Listen

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();
 
    }
}

Für Arrays

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 ...

Es gibt zwei Iteratormuster

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.

  • 8/30… Inhalt in den Kommentaren und einige Korrekturen auf Japanisch *

Schlüsselwörter, die beim nächsten Mal organisiert werden sollen

Parallelverarbeitung Schließung Interner Iterator

  • Außerdem bekam ich einen Kommentar und lernte zum ersten Mal den Namen Syntax Sugar. Ich möchte den Unterschied zwischen dem Arrangement und der Sammlung über Syntax Sugar untersuchen und zusammenfassen ... *

Referenzseite

Überdenken: GoF-Entwurfsmuster Java Iterator (erweitert für Syntax) Interface Iterator Java2 SE 5.0 Tiger Volume für Anweisung erweitert Grundlegendes zu Java SE 8 und Stream API

Recommended Posts