Miten voin muuttaa taulukon Iteraattoriksi?

jos on joukko referenssityyppiä, helpoin tapa on muuttaa se luetteloksi. Ei mitään uutta:

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

vaikeuksia syntyy, jos on joukko alkukantaisia. Jos sinulla on int array, sen siirtäminen Arrays.asList() ei johda List<Integer>. Sen sijaan saat List<int>: n, mikä ei varmaan ole sitä, mitä haluat!

iteraattorin ongelma tässä tapauksessa on se, että se voi iteroida vain viitetyypin alkioita, ei primitiivejä. Voit luoda iteraattorin Boxed primitives alkaen primitiivinen array (ainakin meidän tavallinen trio int, long, ja double) ensin käärimällä array Stream ja sitten saada iteraattorin siitä:

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

voit käyttää tätä Iteraattoria tavalliseen tapaan. Huomaa kuitenkin, että jokainen Soitto next() johtaa lopulta primitiiviseen arvoon, joka aiheuttaa jonkin verran ylimenokykyä. Jos haluat käyttää iteraattori-tyylisiä konstruktioita, mutta välttää nyrkkeilyä yläpuolella, voit käyttää uusia alkeellisia Iteraattoreita, jotka on otettu käyttöön Java 8: ssa. Osoittautuu, että alkukantaisen virran, kuten IntStream, palauttama iteraattori on sekä Iterator<Integer> että uusi PrimitiveIterator.OfInt. Tällä uudella iteraattorilla on menetelmä nextInt(), joka palauttaa Iteraattorilta int – arvon ilman, että se nyrkkeilee sitä. Sitä voidaan käyttää seuraavasti:

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

sama pätee long ja double iteraattoreihin, joilla on analogiset nextLong() ja nextDouble() menetelmät.

primitiivisten matriisien muuntaminen primitiivisiksi virroiksi todennäköisesti tyydyttää useimmat käyttötapaukset. Kuitenkin nämä vaihtoehtoiset mekanismit ovat olemassa, joiden avulla voit luoda pitkäaikainen iteraattori-tyylisiä konstruktioita, jos ne ovat tarpeen.

Vastaa

Sähköpostiosoitettasi ei julkaista.