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.