Hoe kan ik een array veranderen in een Iterator?

als u een array van referentietype hebt, is de makkelijkste manier om er een lijst van te maken. Niets nieuws hier:

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

moeilijkheden ontstaan als je een reeks primitieven hebt. Als u een int array hebt, geeft het doorgeven aan Arrays.asList() geen List<Integer>. In plaats daarvan krijg je een List<int>, wat waarschijnlijk niet is wat je wilt!

het probleem met Iterator in dit geval is dat het alleen kan itereren over elementen van referentietype, niet primitieven. Je kunt een Iterator van in een doos geplaatste primitieven maken van een primitieve array (tenminste van ons gebruikelijke trio van int, long, en double) door eerst de array in een Stream te wikkelen en dan een Iterator daarvan te krijgen:

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

u kunt deze Iterator op de gebruikelijke manier gebruiken. Merk echter op dat elke aanroep tot next() uiteindelijk de primitieve waarde zal tegenhouden, wat wat overhead met zich meebrengt. Als u iterator-stijl constructies wilt gebruiken, maar voorkomen dat boksen overhead, kunt u gebruik maken van de nieuwe primitieve Iterators geà ntroduceerd in Java 8. Het blijkt dat de Iterator die wordt geretourneerd door een primitieve stroom zoals IntStream zowel een Iterator<Integer> als de nieuwe PrimitiveIterator.OfIntis. Deze nieuwe iterator heeft een methode nextInt() die de int waarde van de Iterator retourneert zonder deze in te boksen. Het kan als volgt worden gebruikt:

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

hetzelfde geldt voor long en double iteratoren, die analoge nextLong() en nextDouble() methoden hebben.

het omzetten van primitieve arrays naar primitieve streams voldoet waarschijnlijk aan de meeste use cases. Echter, deze alternatieve mechanismen bestaan die u toelaten om langdurige Iterator-stijl constructies te creëren als ze nodig zijn.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.