Idiomatische Methode zur Verwendung für jede Schleife bei gegebenem Iterator?

Wenn die erweiterte for-Schleife (foreach-Schleife) zu Java hinzugefügt wurde, funktioniert sie mit einem Ziel eines Arrays oder mitIterable.

for ( T item : /*T[] or Iterable<? extends T>*/ ) {
    //use item
}

Das funktioniert hervorragend für Collection-Klassen, die nur einen Iterationstyp implementieren und daher ein einziges @ habeiterator() Methode

Aber ich bin unglaublich frustriert, wenn ich einen nicht standardmäßigen Iterator aus einer Collection-Klasse verwenden möchte. Ich habe zum Beispiel kürzlich versucht, jemandem zu helfen, ein @ zu benutzeDeque als LIFO / Stack, druckt dann aber die Elemente in FIFO-Reihenfolge. Ich wurde gezwungen, dies zu tun:

for (Iterator<T> it = myDeque.descendingIterator(); it.hasNext(); ) {
   T item = it.next();
   //use item
}

Ich verliere die Vorteile der for-each-Schleife. Es geht nicht nur um Tastenanschläge. Ich mag es nicht, den Iterator offenzulegen, wenn ich nicht muss, da es leicht ist, den Fehler zu machen, @ aufzurufeit.next() zweimal usw.

Now im Idealfall denke ich, die for-each-Schleife sollte ein @ akzeptiert habIterator auch. Aber das tut es nicht. Gibt es also eine idiomatische Möglichkeit, die for-each-Schleife unter diesen Umständen zu verwenden? Ich würde auch gerne Vorschläge hören, in denen häufig verwendete Sammlungsbibliotheken wie Guava verwendet werden.

Das Beste, was ich in Abwesenheit einer Hilfsmethode / -klasse finden kann, ist:

for ( T item : new Iterable<T>() { public Iterator<T> iterator() { return myDeque.descendingIterator(); } } ) {
    //use item
}

Was es nicht wert ist, benutzt zu werden.

Ich würde gerne sehen, Guava haben so etwas wieIterables.wrap das idiomatisch zu machen, aber nichts dergleichen gefunden. Natürlich könnte ich meinen eigenen Iterator-Wrapper über eine Klassen- oder Helfer-Methode rollen. Irgendwelche anderen Ideen?

Bearbeiten Kann irgendjemand einen gültigen Grund dafür nennen, warum die erweiterte for-Schleife nicht in der Lage sein sollte, einfach ein @ zu akzeptiereIterator? Es wäre wahrscheinlich ein langer Weg, um mich mit dem aktuellen Design zum Leben zu erwecken.

Antworten auf die Frage(16)

Ihre Antwort auf die Frage