[Java] Interne Iterator-Hinweise

Einführung

Als ich Stream und für jeden studierte, stieß ich auf ein unbekanntes Wort namens interner Iterator, also ein Memo zu dieser Zeit. Es ist wahrscheinlich angemessen, weil ich es selbst verstanden habe.

Hat der Iterator ein Inneres und ein Äußeres?

Was mich überraschte, als ich das Wort interner Iterator lernte, war, dass es zwei Arten von Iteratoren gibt: interne Iteratoren und externe Iteratoren. Dann fragte ich mich, was der Iterator war, den ich kannte, also untersuchte ich zuerst den Iterator.

Iterator (Englisch: Iterator) ist eine Abstraktion der iterativen Verarbeitung für jedes Element eines Arrays oder einer ähnlichen kollektiven Datenstruktur (Sammlung oder Container) in einer Programmiersprache. In der eigentlichen Programmiersprache erscheint es als Objekt oder Grammatik. In JIS wird es als Repeater (Hampukushi) übersetzt [1] [2].

Zitat: Iterator-Wikipedia

Ist es eine Abstraktion der iterativen Verarbeitung? Ich habe das Gefühl, dass ich das irgendwie verstanden habe. Es gibt zwei Arten dieser Abstraktion, externe und interne. Betrachten wir nun den Unterschied zwischen den beiden.

Externer Iterator

In Java ist das Objekt, das die Schnittstellenfamilie java.util.Iterator implementiert, der externe Iterator. Iterator seit Java 1.5 unterstützt Generika.

Zitat: Iterator-Wikipedia

Mit anderen Worten, was ich als Iterator erkannte, war ein externer Iterator. Die Implementierung des externen Iterators sieht also so aus.

Externer Iterator


Iterator<Hoge> iterator =Derjenige, der Iterable implementiert.iterator()
while (iterator.hasNext()) {
    // iterator.next()Etwas zu tun
}

Ich habe es ziemlich passend geschrieben, aber durch die Implementierung einer Schnittstelle namens Iterable und einen Iterator ist es möglich, den iterativen Prozess zu abstrahieren. Wird der sich wiederholende Teil (während) nach außen exponiert und als externer Iterator bezeichnet?

Interner Iterator

Die Art der Wiederholungsmethode, bei der ein Ruby-Block, der die Verarbeitung für jedes Element ausdrückt, an die Methode des Containerobjekts übergeben wird und die Methode die Verarbeitung für jedes Element abruft, wird als "interner Iterator" bezeichnet.

Der interne Iterator erstellt keine zusätzlichen Klassen und ist einfach zu verwenden und zu erstellen. Wenn die Sprache das Schließen jedoch nicht unterstützt, müssen Möglichkeiten für den Informationsaustausch zwischen dem Schleifenkörper und der Außenseite entwickelt werden. Wie im Beispiel der C-Sprache zu sehen ist, verschlechtert sich die Verwendbarkeit als Schleife. Aus diesem Grund werden in C ++ und Java externe Iteratoren verwendet, die keine Abschlüsse haben.

Zitat: Matsumoto Naoden Programming Okite 5th (2)

Ich bin mir nicht sicher, also werde ich mir die Implementierung ansehen.

Interner Iterator


List<Integer> list =Etwas Liste;
list.forEach(n -> n + 1);

//Imaginär für jeden
forEach(wird bearbeitet) {
    for (Wiederholung) {
        //Prozess aufrufen;
    }
}

Mit anderen Worten, die Wiederholung befindet sich im Inneren und besteht die Verarbeitung, die Sie ausführen möchten. Deshalb nenne ich es einen internen Iterator. Im Fall von Java wird eine Funktionstyp-Schnittstelle übergeben, da es keine erstklassige Funktion gibt.

Ich bin mir hier also nicht sicher, ob es schwierig ist, einen internen Iterator zu implementieren, wenn er keine Schließungen unterstützt. Warum brauchen Sie einen Verschluss?

Schließung

Ich wusste überhaupt nicht viel über Schließungen, also habe ich nachgeschlagen. Ich habe verstanden, dass eine Funktion andere Variablen als innerhalb der Funktion als Bereich enthält. Ich habe auch hier viel recherchiert, deshalb würde ich gerne einen weiteren Artikel schreiben.

Schließung


function createCounter() {
  let count = 0;

  return function() {
    count++;
    console.log(count);
  };
}

let counter  = createCounter();
counter(); // 1
counter(); // 2

Mit JS sieht es so aus.

Warum Sie einen Abschluss für Ihren internen Iterator benötigen

Anfangs hatte ich keine Ahnung, warum ich es brauchte. Irgendwie habe ich verstanden, als ich die Schließung recherchiert habe. Java-Beispielcode vorerst.

Interner Iterator und Abschluss


final List<Integer> list =Etwas Liste
final Integer n =Eine Nummer;
list.forEach(value -> value + n);

//Imaginär für jeden
forEach(wird bearbeitet) {
    for (Wiederholung) {
        //Prozess aufrufen;
    }
}

Zu diesem Zeitpunkt kann aufgrund des Schließungsmechanismus n verwendet werden, indem der Gültigkeitsbereich auch in dem an forEach übergebenen Prozess eingegeben wird. Wenn es keinen Abschluss gibt, muss ein Mechanismus zum Übergeben von Argumenten bereitgestellt oder als zu wiederholendes Feld verwendet werden. Mit anderen Worten, das Schließen erleichtert die Implementierung.

Zusammenfassung

Es gibt zwei Arten von Iteratoren: externe Iteratoren und interne Iteratoren. Der interne Iterator sieht persönlich schlauer aus. Ohne einen Abschluss ist die Implementierung eines internen Iterators jedoch umständlich.

Beiseite

Wenn ich normalerweise lerne, mache ich mir Notizen und habe darauf basierend einen Artikel geschrieben. Ich kann nichts passenderes schreiben, als die Leute sehen können, und ist die Quelle des Zitats wirklich korrekt? Ich muss darüber nachdenken. Nun, diesmal habe ich es als Testversion geschrieben, daher denke ich, dass es etwas Passendes gibt, aber ich möchte mir mehr Zeit nehmen, wenn ich das nächste Mal etwas schreibe.

Außerdem habe ich hauptsächlich über Java geschrieben, aber es scheint, dass sich das Schließen in Java ein wenig von anderen funktionalen Sprachen unterscheidet. Ich sah einen Artikel, in dem stand: "Java 8 Lambda ist kein Abschluss, aber Sie können mit einem Abschluss tun, was Sie wollen, und Sie können nicht tun, was Sie nicht tun können, also ist daran nichts auszusetzen." Ich bin mir nicht sicher, also werde ich mehr untersuchen.

Recommended Posts

[Java] Interne Iterator-Hinweise
Java abstrakter Modifikator [Hinweis]
Einfaches Memo von JUnit of Java
[Java] Java SE 8 Silver Note
[Hinweis] Java: Zeichenfolgensuche
[Hinweis] Java: Zeichenkettenübersicht
Meine Studiennotiz (Java)
Java: Datum hinzufügen [Hinweis]
Hinweise zu Java GC
(Hinweis) Java-Klassen / Variablen / Methoden
Java und Iterator Teil 1 Externe Iterator Edition
[Java] [Spring] Spring Boot 1.4-> 1.2 Downgrade Hinweis
Lernen von Java mit Progate Note 1
Memo
[Hinweis] Java Silver SE8-Qualifikation erworben
[Java] Mit Arrays.asList () zu beachtende Punkte
Memo
Anmerkung 1: Grundlegende Stolpersteine (Java, Javascript)
Java
[Hinweis] Behandlung von Java-Dezimalstellen
Meine Gewinnnotiz: Einführung von Java in Ubuntu
So drehen Sie Iterator Dojo (Java)
Java
Java Agent Actual Anti-Ordering Injection Interne Shell
[Java] Listen- / Kartenelemente mit Iterator abrufen
Übergeben Sie Parameter beim Debuggen von vscode java. [Hinweis]
[Anfänger] Java-Methode / Klasse / externe Bibliothek [Anmerkung 23]
Java SE 8 Silver (Java SE 8 Programmer I) Pass Hinweis
Grundkenntnisse in der Java-Entwicklung Schreiben von Notizen
Hinweis: next ・ nextLine (Paiza lernt Java-Einführung 9: # 06)
[Hinweis] Zusammenarbeit zwischen Java und DB (Basic)
Verwendung der Java Scanner-Klasse (Hinweis)