Was ist ein externer und interner Iterator in Java?Externer Iterator vs Interner Iterator
Antwort
Es geht um wen controls the iteration.
Weitere Einzelheiten sind in dieser Frage What are the benefits of the Iterator interface in Java?
ich diesen description gefunden:
Externe vs. interne Iteratoren.
Externe Iteratoren - wenn die Iteration durch das Sammlungsobjekt gesteuert wird, sagen wir, dass wir einen externen Iterator haben.
In Sprachen wie .net oder Java ist es sehr einfach, externe Iteratoren zu erstellen. In unserer klassischen Implementierung ist ein externer Iterator implementiert. Im folgenden Beispiel wird ein externer Iterator verwendet:
// using iterators for a clloection of String objects:
// using in a for loop
for (Iterator it = options.iterator(); it.hasNext();) {
String name = (String)it.next();
System.out.println(name);
}
// using in while loop
Iterator name = options.iterator();
while (name.hasNext()){
System.out.println(name.next());
}
// using in a for-each loop (syntax available from java 1.5 and above)
for (Object item : options)
System.out.println(((String)item));
Interne Iteratoren - Wenn der Iterator sie kontrolliert haben wir einen internen Iterator
Auf der anderen Seite der Implementierung und Verwendung von internen Iteratoren wirklich schwierig ist. Wenn ein interner Iterator verwendet wird, bedeutet dies, dass der Code, der ausgeführt werden soll, an das Aggregatobjekt delegiert ist. Zum Beispiel in Sprachen, die Unterstützung für diese ist leicht zu interne Iteratoren rufen bieten:
collection do: [:each | each doSomething] (Smalltalk)
Die Hauptidee ist, den Code zu übergeben, um die Sammlung durchgeführt werden. Dann ruft die Sammlung intern die doSomething-Methode für jede der Komponenten auf. In C++ ist es möglich, die Methode doMethod als Zeiger zu senden. In C#, .NET oder VB.NET ist es möglich, die Methode als Delegat zu senden. In Java muss das Designmuster Functor
verwendet werden. Die Grundidee ist, eine Basisschnittstelle mit nur einer Methode (doSomething) zu erstellen. Dann wird die Methode in einer Klasse implementiert, die die Schnittstelle implementiert, und die Klasse wird zur Iteration an die Sammlung übergeben. Weitere Details finden Sie im Designmuster Functor
.
Externe Iterator
Wenn Sie einen Iterator und Schritt darüber hinwegkommen, dass ein externer Iterator
for (Iterator iter = var.iterator(); iter.hasNext();) {
Object obj = iter.next();
// Operate on obj
}
Interne Iterator
Wenn Sie eine Funktion Objekt an eine Methode übergeben, überfahren eine Liste, das ist ein interner Iterator
var.each(new Functor() {
public void operate(Object arg) {
arg *= 2;
}
});
- 1. Iterator vs. iteratee
- 2. Iterator vs Reverse_iterator
- 3. Java Enumeration vs Iterator
- 4. PHP-Schnittstellen IteratorAggregate vs Iterator?
- 5. Iterator Überlastung Elementauswahl vs Indirektionsoperator
- 6. C++ Iterator und Reverse-Iterator
- 7. Leistungsunterschied zwischen ++ Iterator und Iterator ++?
- 8. Konvertieren Iterator Liste ändert die Iterator
- 9. Casting HashMap Key Iterator zur Liste Iterator
- 10. Google Drive Datei Iterator in Ordner Iterator
- 11. Warum übernimmt Iterator :: take_while den Iterator?
- 12. const_iterator vs iterator für std :: list
- 13. Iterator Hierarchie
- 14. Generic iterator
- 15. Java Iterator
- 16. Iterator-Nachfolger
- 17. Iterator postgreslql
- 18. Vektor Iterator nicht dereferencable
- 19. Liste Iterator nicht inkrementell
- 20. Singular Iterator Fehler Got mit Iterator in Looping und pop_back
- 21. scala einen Iterator [Option [T]] in einen Iterator [T]
- 22. Listen-Iterator Remove()
- 23. C++ Iterator Probleme
- 24. cpp iterator problem
- 25. Mit boost :: Iterator
- 26. Wie gleich Bereich „Iterator“
- 27. Ruby-Iterator Ausbeute
- 28. Python fauler Iterator
- 29. Vector Iterator nicht inkrementiert
- 30. Iterator funktioniert nicht
Da Java 5 die bevorzugte Möglichkeit für die Verwendung ein externer Iterator, wäre es, die for-each-Schleife zu verwenden: * für (Object o: var) {// NOOP} *, obwohl es nur syntaktischer Zucker für den expliziten Iterator ist, der die Version verwendet. – Alex
@JohannZacharee wird keine foreach-Schleife als Interner Iterator betrachtet, da wir nicht die Kontrolle über den Iterator haben? – denis631
@ denis631 Ja, ich stimme zu, dass die foreach-Schleife ähnlich wie ein interner Iterator funktioniert. Ich habe es nicht als mein Beispiel benutzt, da ich verstehe, dass Java sie zur Kompilierzeit in einen externen Iterator konvertiert. Ich habe ein funktionelles Beispiel gewählt, um die Unterschiede besser zu veranschaulichen. –