Como posso transformar uma matriz em um iterador?

se você tiver uma matriz de tipo de referência, a maneira mais fácil é transformá-la em uma lista. Nada de novo aqui:

MyObject array = ... ;Iterator<MyObject> iterator = Arrays.asList(array).iterator();

dificuldades surgem se você tiver uma série de primitivas. Se você tiver um array int, passá-lo para Arrays.asList() não resulta em um List<Integer>. Em vez disso, você recebe um List<int>, que provavelmente não é o que você quer!

o problema com o iterador neste caso é que ele só pode iterar sobre elementos do tipo de referência, não primitivos. Você pode criar um Iterador de box primitivos a partir de uma primitiva matriz (pelo menos a nossa habitual trio de int, long, e double) pela primeira moldagem a matriz em um Córrego e, em seguida, obter um Iterador a partir de que:

int array = ... ;Iterator<Integer> iterator = Arrays.stream(array).iterator();

Você pode usar este Iterador da forma habitual. Observe, no entanto, que cada chamada para next() acabará encaixotando o valor primitivo, o que incorre em alguma sobrecarga. Se você quiser usar construções no estilo iterador, mas evitar sobrecarga de boxe, você pode usar os novos iteradores primitivos introduzidos no Java 8. Acontece que o iterador retornado por um fluxo primitivo, como IntStream, é um Iterator<Integer> e o novo PrimitiveIterator.OfInt. Este novo iterador tem um método nextInt() que retorna o valor int do iterador sem encaixotá-lo. Pode ser usado da seguinte forma:

PrimitiveIterator.OfInt intIterator = Arrays.stream(array).iterator();while (intIterator.hasNext()) { methodTakingInt(intIterator.nextInt());}

o mesmo se aplica aos iteradores long e double, que possuem métodos análogos nextLong() e nextDouble().

Converter matrizes primitivas em fluxos primitivos provavelmente satisfaz a maioria dos casos de uso. No entanto, existem mecanismos alternativos que permitem criar construções de estilo iterador de longa data, caso sejam necessárias.

Deixe uma resposta

O seu endereço de email não será publicado.