Wie kann ich ein Array in einen Iterator verwandeln?

Wenn Sie ein Array vom Referenztyp haben, ist es am einfachsten, es in eine Liste umzuwandeln. Nichts Neues hier:

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

Schwierigkeiten treten auf, wenn Sie eine Reihe von Grundelementen haben. Wenn Sie ein int -Array haben, führt die Übergabe an Arrays.asList() nicht zu einem List<Integer> . Stattdessen erhalten Sie eine List<int> , was wahrscheinlich nicht das ist, was Sie wollen!

Das Problem mit Iterator in diesem Fall ist, dass es nur über Elemente des Referenztyps iterieren kann, nicht über Grundelemente. Sie können einen Iterator von boxed Primitiven aus einem primitiven Array erstellen (mindestens unser übliches Trio von int, long und double ), indem Sie zuerst das Array in einen Stream einschließen und dann einen Iterator daraus erhalten:

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

Sie können diesen Iterator auf die übliche Weise verwenden. Beachten Sie jedoch, dass jeder Aufruf von next() den primitiven Wert boxt, was zu einem gewissen Overhead führt. Wenn Sie Konstrukte im Iteratorstil verwenden möchten, aber Boxing-Overhead vermeiden möchten, können Sie die neuen primitiven Iteratoren verwenden, die in Java 8 eingeführt wurden. Es stellt sich heraus, dass der Iterator, der von einem primitiven Stream wie IntStream zurückgegeben wird, sowohl ein Iterator<Integer> als auch der neue PrimitiveIterator.OfInt ist. Dieser neue Iterator verfügt über eine Methode nextInt(), die den Wert int aus dem Iterator zurückgibt, ohne ihn zu boxen. Es kann wie folgt verwendet werden:

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

Gleiches gilt für long und double Iteratoren, die analoge nextLong() und nextDouble() Methoden haben.

Das Konvertieren primitiver Arrays in primitive Streams erfüllt wahrscheinlich die meisten Anwendungsfälle. Es gibt jedoch diese alternativen Mechanismen, mit denen Sie bei Bedarf langjährige Konstrukte im Iteratorstil erstellen können.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.