Jak mohu proměnit pole v iterátor?

pokud máte pole referenčního typu, nejjednodušší je změnit jej na seznam. Nic nového zde:

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

problémy vznikají, pokud máte řadu primitiv. Pokud máte pole int, předání do Arrays.asList() nevede k List<Integer>. Místo toho dostanete List<int>, což pravděpodobně není to, co chcete!

problém s Iterátorem v tomto případě je, že může iterovat pouze nad prvky referenčního typu, nikoli primitivy. Můžete vytvořit iterátor boxovaných primitiv z primitivního pole (alespoň z naší obvyklé trojice int, long a double) tak, že nejprve zabalíte pole do proudu a poté z něj získáte iterátor:

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

tento iterátor můžete použít obvyklým způsobem. Všimněte si však, že každé volání na next() skončí boxováním primitivní hodnoty,což způsobuje určitou režii. Pokud chcete používat konstrukty ve stylu Iterátoru, ale vyhnout se režii boxu, můžete použít nové primitivní iterátory představené v Javě 8. Ukazuje se, že iterátor vrácený primitivním proudem, jako je IntStream, je jak Iterator<Integer>, tak nový PrimitiveIterator.OfInt. Tento nový iterátor má metodu nextInt(), která vrací hodnotu int z Iterátoru, aniž by ji boxovala. Může být použit následovně:

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

totéž platí pro long a double iterátory, které mají analogické metody nextLong() a nextDouble().

převod primitivních polí na primitivní proudy pravděpodobně vyhovuje většině případů použití. Existují však tyto alternativní mechanismy, které vám umožňují vytvářet dlouhodobé konstrukce ve stylu Iterátoru, pokud to bude nutné.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.