Si tiene una matriz de tipo de referencia, la forma más fácil es convertirla en una Lista. Nada nuevo aquí:
MyObject array = ... ;Iterator<MyObject> iterator = Arrays.asList(array).iterator();
Las dificultades surgen si tienes una serie de primitivos. Si tiene un array int
, pasarlo a Arrays.asList()
no resulta en un List<Integer>
. En su lugar, obtienes un List<int>
, ¡que probablemente no es lo que quieres!
El problema con el Iterador en este caso es que solo puede iterar sobre elementos de tipo de referencia, no sobre primitivas. Puede crear un Iterador de primitivas en caja a partir de una matriz primitiva (al menos desde nuestro trío habitual de int
, long
y double
) envolviendo primero la matriz en una secuencia y luego obteniendo un Iterador de esa:
int array = ... ;Iterator<Integer> iterator = Arrays.stream(array).iterator();
Puede usar este iterador de la manera habitual. Sin embargo, tenga en cuenta que cada llamada a next()
terminará encajonando el valor primitivo, lo que incurrirá en cierta sobrecarga. Si desea utilizar construcciones de estilo iterador, pero evita la sobrecarga, puede usar los nuevos Iteradores primitivos introducidos en Java 8. Resulta que el Iterador devuelto por un flujo primitivo como IntStream
es a la vez un Iterator<Integer>
y el nuevo PrimitiveIterator.OfInt
. Este nuevo iterador tiene un método nextInt()
que devuelve el valor int
del Iterador sin guardarlo. Se puede utilizar de la siguiente manera:
PrimitiveIterator.OfInt intIterator = Arrays.stream(array).iterator();while (intIterator.hasNext()) { methodTakingInt(intIterator.nextInt());}
Lo mismo se aplica a los iteradores long
y double
, que tienen métodos análogos nextLong()
y nextDouble()
.
La conversión de matrices primitivas a flujos primitivos probablemente satisfaga la mayoría de los casos de uso. Sin embargo, existen estos mecanismos alternativos que le permiten crear construcciones de estilo iterador de larga data en caso de que sean necesarias.