Hvordan kan jeg gøre et array til en Iterator?

hvis du har en række referencetyper, er den nemmeste måde at gøre det til en liste. Intet nyt her:

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

vanskeligheder opstår, hvis du har en række primitiver. Hvis du har et int array, fører det til Arrays.asList() ikke til en List<Integer>. I stedet får du en List<int>, hvilket sandsynligvis ikke er det, du vil have!

problemet med Iterator i dette tilfælde er, at det kun kan gentage over elementer af referencetype, ikke primitiver. Du kan oprette en Iterator af boksede primitiver fra et primitivt array (ved fra mindst vores sædvanlige trio af int, long og double) ved først at indpakke arrayet i en strøm og derefter få en Iterator fra det:

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

du kan bruge denne Iterator på den sædvanlige måde. Bemærk dog, at hvert opkald til next() vil ende med at bokse den primitive værdi, som medfører noget overhead. Hvis du vil bruge Iterator-stil konstruktioner, men undgå boksning overhead, kan du bruge de nye primitive iteratorer introduceret i Java 8. Det viser sig, at Iteratoren returneret af en primitiv strøm som IntStream er både en Iterator<Integer> og den nye PrimitiveIterator.OfInt. Denne nye iterator har en metode nextInt(), der returnerer int værdien fra Iteratoren uden at bokse den. Det kan bruges som følger:

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

det samme gælder long og double iteratorer, som har analoge nextLong() og nextDouble() metoder.

konvertering af primitive arrays til primitive strømme opfylder sandsynligvis de fleste brugssager. Imidlertid findes disse alternative mekanismer, der giver dig mulighed for at oprette langvarige Iterator-stilkonstruktioner, hvis de er nødvendige.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.