Hur kan jag förvandla en array till en Iterator?

om du har en matris med referenstyp är det enklaste sättet att göra det till en lista. Inget nytt här:

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

svårigheter uppstår om du har en rad primitiver. Om du har en int array, passerar den till Arrays.asList() resulterar inte i en List<Integer>. Istället får du en List<int> , vilket förmodligen inte är vad du vill!

problemet med Iterator i det här fallet är att det bara kan iterera över element av referenstyp, inte primitiver. Du kan skapa en Iterator av boxade primitiver från en primitiv array (från minst vår vanliga trio av int, long och double) genom att först förpacka arrayen i en ström och sedan få en Iterator från det:

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

du kan använda denna Iterator på vanligt sätt. Observera dock att varje samtal till next() kommer att sluta boxas det primitiva värdet, vilket medför vissa kostnader. Om du vill använda Iterator-stil konstruktioner men undvika boxning overhead, kan du använda de nya primitiva iteratorer introduceras i Java 8. Det visar sig att Iteratorn som returneras av en primitiv ström som IntStream är både en Iterator<Integer> och den nya PrimitiveIterator.OfInt. Denna nya iterator har en metod nextInt() som returnerar int – värdet från Iteratorn utan att boxas. Den kan användas enligt följande:

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

detsamma gäller long och double iteratorer, som har analoga nextLong() och nextDouble() metoder.

konvertering av primitiva matriser till primitiva strömmar uppfyller förmodligen de flesta användningsfall. Dessa alternativa mekanismer finns dock som gör att du kan skapa långvariga Iterator-stilkonstruktioner om de skulle vara nödvändiga.

Lämna ett svar

Din e-postadress kommer inte publiceras.