Hvordan kan jeg slå en matrise til en Iterator?

hvis du har en rekke referansetyper, er den enkleste måten å gjøre Den om til En Liste. Ikke noe nytt her:

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

Vanskeligheter oppstår hvis du har en rekke primitiver. Hvis du har en int – matrise, fører det til Arrays.asList() ikke til en List<Integer>. I stedet får du en List<int>, som sannsynligvis ikke er det du vil ha!

problemet med Iterator i dette tilfellet er at det bare kan iterere over elementer av referansetype, ikke primitiver. Du kan lage en iterator av boxed primitiver fra en primitiv array (fra minst vår vanlige trio av int, long og double) ved først å pakke arrayet i En Strøm og deretter få en Iterator fra det:

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

Du kan bruke Denne Iteratoren på vanlig måte. Vær imidlertid oppmerksom på at hvert kall til next() vil ende opp med å bokse den primitive verdien, noe som medfører noe overhead. Hvis du vil bruke Iterator – stil konstruksjoner, men unngå boksing overhead, kan du bruke de nye primitive Iteratorene introdusert I Java 8. Det viser seg at Iteratoren returnert av en primitiv strøm som IntStream er både en Iterator<Integer> og den nye PrimitiveIterator.OfInt. Denne nye iteratoren har en metode nextInt() som returnerer int – verdien fra Iteratoren uten å bokse den. Den kan brukes som følger:

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

det samme gjelder for long og double iteratorer, som har analoge nextLong() og nextDouble() metoder.

Konvertering av primitive arrays til primitive strømmer tilfredsstiller sannsynligvis de fleste brukstilfeller. Imidlertid eksisterer disse alternative mekanismene som lar deg lage langvarige iterator-stilkonstruksjoner hvis de er nødvendige.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.