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