Cum pot transforma o matrice într-un Iterator?

dacă aveți o matrice de tip de referință, cel mai simplu mod este să-l transforme într-o listă. Nimic nou aici:

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

dificultăți apar dacă aveți o serie de primitive. Dacă aveți o matrice int, trecerea la Arrays.asList()nu are ca rezultat o List<Integer>. În schimb, veți obține un List<int>, care probabil nu este ceea ce doriți!

problema cu Iteratorul în acest caz este că poate itera doar peste elemente de tip de referință, nu primitive. Puteți crea un Iterator de primitive în cutie dintr-o matrice primitivă (cel puțin din trio-ul nostru obișnuit de int, long și double) înfășurând mai întâi matricea într-un flux și apoi obținând un Iterator din acesta:

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

puteți utiliza acest Iterator în mod obișnuit. Rețineți totuși că fiecare apel la next() va ajunge să boxeze valoarea primitivă, care suportă unele cheltuieli generale. Dacă doriți să utilizați constructe în stil Iterator, dar evitați boxul deasupra capului, puteți utiliza noile Iteratoare primitive introduse în Java 8. Se pare că Iteratorul returnat de un flux primitiv, cum ar fi IntStream este atât un Iterator<Integer>, cât și Noul PrimitiveIterator.OfInt. Acest nou iterator are o metodă nextInt() care returnează valoarea int din Iterator fără a o boxa. Poate fi folosit după cum urmează:

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

același lucru este valabil și pentru iteratoarele long și double, care au metode analoage nextLong() și nextDouble().

conversia matricelor primitive în fluxuri primitive satisface probabil majoritatea cazurilor de utilizare. Cu toate acestea, există aceste mecanisme alternative care vă permit să creați construcții în stil Iterator de lungă durată, dacă acestea sunt necesare.

Lasă un răspuns

Adresa ta de email nu va fi publicată.