hogyan lehet egy tömböt Iterátorrá alakítani?

ha van referenciatípus-tömbje, akkor a legegyszerűbb módja annak, hogy listává alakítsa. Semmi új itt:

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

nehézségek merülnek fel, ha van egy sor primitívek. Ha van egy int tömb, átadva azt Arrays.asList() nem eredményez List<Integer>. Ehelyett kapsz egy List<int> – et, ami valószínűleg nem az, amit akarsz!

az Iterátor problémája ebben az esetben az, hogy csak referenciatípusú elemeken képes iterálni, primitíveken nem. Létrehozhatunk egy iterátort dobozos primitívekből egy primitív tömbből (legalábbis a szokásos int, long és double trióból), ha először betekerjük a tömböt egy folyamba, majd kapunk egy Iterátort:

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

ezt az Iterátort a szokásos módon használhatja. Ne feledje azonban, hogy minden next() – ra történő hívás a primitív értéket bokszolja, ami némi rezsi. Ha Iterátor stílusú konstrukciókat szeretne használni, de elkerüli a boksz felső részét, használhatja a Java 8-ban bevezetett új primitív iterátorokat. Kiderül, hogy az iterátor, amelyet egy primitív adatfolyam, például IntStream ad vissza, mind Iterator<Integer>, mind az új PrimitiveIterator.OfInt. Ennek az új iterátornak van egy nextInt() módszere, amely a int értéket adja vissza az Iterátorból anélkül, hogy bokszolná. Ezt fel lehet használni a következőképpen:

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

ugyanez vonatkozik a long és double iterátorokra, amelyek Analóg nextLong() és nextDouble() metódusokkal rendelkeznek.

a primitív tömbök primitív folyamokká alakítása valószínűleg kielégíti a legtöbb felhasználási esetet. Léteznek azonban ezek az alternatív mechanizmusok, amelyek lehetővé teszik hosszú távú Iterátor stílusú konstrukciók létrehozását, ha szükségesek.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.