¿Manera idiomática de usar para cada ciclo dado un iterador?

Cuando el bucle for mejorado (bucle foreach) se agregó a Java, se hizo que funcionara con un objetivo de una matriz oIterable.

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

Eso funciona muy bien para las clases de Colección que solo implementan un tipo de iteración y, por lo tanto, tienen un soloiterator() método.

Pero me encuentro increíblemente frustrado las veces que quiero usar un iterador no estándar de una clase Collection. Por ejemplo, recientemente estaba tratando de ayudar a alguien a usar unDeque como un LIFO / stack pero luego imprime los elementos en orden FIFO. Me vi obligado a hacer esto:

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

Pierdo las ventajas del ciclo for-each. No se trata solo de las pulsaciones de teclas. No me gusta exponer el iterador si no es necesario, ya que es fácil cometer el error de llamarit.next() dos veces, etc.

Ahora, idealmente, creo que el ciclo for-each debería haber aceptado unIterator también. Pero no lo hace. Entonces, ¿hay una forma idiomática de usar el ciclo for-each en estas circunstancias? También me encantaría escuchar sugerencias que usan bibliotecas de colecciones comunes como Guava.

Lo mejor que se me ocurre en ausencia de un método / clase auxiliar es:

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

Que no vale la pena usar.

Me encantaría ver que la guayaba tiene algo comoIterables.wrap para hacer esto idiomático, pero no encontré nada de eso. Obviamente, podría rodar mi propio contenedor Iterator a través de un método de clase o auxiliar. ¿Alguna otra idea?

Editar: Como nota al margen, ¿alguien puede dar una razón válida de por qué el bucle for mejorado no debería haber sido capaz de aceptar unIterator? Probablemente me ayudaría mucho a vivir con el diseño actual.

Respuestas a la pregunta(8)

Su respuesta a la pregunta