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.OfInt
is. 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.