Ich mag die for-each-loop-Konstruktion ( for(T e : iterable)
) in Java, die auf jedem Iterable<T>
funktioniert, weil es in vielen Fällen sehr einfach zu lesen und zu schreiben ist.
Ich frage mich jedoch, ob es irgendeinen Weg gibt, wie ich von einer solchen Schleife auf den zugrunde liegenden Iterator zugreifen kann. Dies kann obligatorisch sein, wenn ich remove()
vom Iterator verwenden möchte.
Wenn die Sammlung relativ klein ist, können Sie alternativ eine Kopie der Sammlung zum Iterieren verwenden, wenn Sie Elemente entfernen möchten, so dass Sie sich nicht wie zwei Sammlungen verhalten müssen.
%Vor% Noch besser: Apache CollectionUtils (und es gibt wahrscheinlich eine Google-Alternative und eine Generika-Alternative) bietet filter(java.util.Collection collection, Predicate predicate)
. In diesem Beispiel wird die gesamte Liste zurückgegeben. Sie können ein Prädikat zur Wiederverwendung speichern.
Sie haben Recht, wenn ein Iterator die Möglichkeit zum sicheren Entfernen eines Objekts aus einer Quellensammlung unterstützt, indem Sie remove () auf dem Iterator selbst aufrufen. Der Punkt hier ist, eine ConcurrentModifiedException zu vermeiden, die impliziert, dass eine Auflistung geändert wurde, während ein Iterator dagegen geöffnet war. Bei einigen Sammlungen können Sie Elemente entfernen oder Elemente hinzufügen, während Sie darüber hinweg iterieren, aber das Aufrufen von remove () auf dem Iterator ist sicherer.
Aber Iterator unterstützt einen abgeleiteten und leistungsstärkeren Cousin ListIterator , der nur in Listen verfügbar ist. Er unterstützt sowohl das Hinzufügen als auch das Entfernen aus einer Liste während der Iteration sowie das bidirektionale Scrollen durch Listen.
das Ändern von Daten hat ein falsch Gefühl. Erstellen Sie einfach ein neues Iterable (oder eine Sammlung) und fügen Sie die Elemente hinzu, die Sie behalten möchten. Die anderen Zeiten gehen in der for Schleife verloren (( irgendwie **