Konvertieren zwischen Stream und Array in Java

1. Einleitung

Es ist üblich, verschiedene dynamische Datenstrukturen in Arrays konvertieren zu müssen.

In diesem Tutorial zeigen wir, wie ein Stream in Java in ein Array konvertiert wird und umgekehrt.

2. Konvertieren eines Streams in ein Array

2.1. Methodenreferenz

Der beste Weg , um einen konvertieren Strom in eine Anordnung zu verwenden ist Stream s toArray () Methode:

public String[] usingMethodReference(Stream stringStream) { return stringStream.toArray(String[]::new); }

Jetzt können wir leicht testen, ob die Konvertierung erfolgreich war:

Stream stringStream = Stream.of("baeldung", "convert", "to", "string", "array"); assertArrayEquals(new String[] { "baeldung", "convert", "to", "string", "array" }, usingMethodReference(stringStream));

2.2. Lambda-Ausdruck

Ein weiteres Äquivalent besteht darin , einen Lambda-Ausdruck an die toArray () -Methode zu übergeben:

public static String[] usingLambda(Stream stringStream) { return stringStream.toArray(size -> new String[size]); }

Dies würde das gleiche Ergebnis liefern wie bei Verwendung der Methodenreferenz.

2.3. Benutzerdefinierte Klasse

Oder wir können alles daran setzen, eine ausgewachsene Klasse zu schaffen.

Wie aus der Stream- Dokumentation hervorgeht, wird eine IntFunction als Argument verwendet. Es nimmt die Arraygröße als Eingabe und gibt ein Array dieser Größe zurück.

Natürlich ist IntFunction eine Schnittstelle, damit wir sie implementieren können:

class MyArrayFunction implements IntFunction { @Override public String[] apply(int size) { return new String[size]; } };

Wir können dann wie gewohnt konstruieren und verwenden:

public String[] usingCustomClass(Stream stringStream) { return stringStream.toArray(new MyArrayFunction()); }

Folglich können wir die gleiche Behauptung wie früher aufstellen.

2.4. Primitive Arrays

In den vorherigen Abschnitten haben wir untersucht, wie ein String-Stream in ein String- Array konvertiert wird . Tatsächlich können wir die Konvertierung für jedes Objekt auf diese Weise durchführen und sie würde den obigen String- Beispielen sehr ähnlich sehen .

Bei Primitiven ist das allerdings etwas anders. Wenn wir beispielsweise einen Stream von Ganzzahlen haben , den wir in int [] konvertieren möchten , müssen wir zuerst die mapToInt () -Methode aufrufen :

public int[] intStreamToPrimitiveIntArray(Stream integerStream) { return integerStream.mapToInt(i -> i).toArray(); }

Es stehen uns auch die Methoden mapToLong () und mapToDouble () zur Verfügung. Bitte beachten Sie auch, dass wir diesmal kein Argument an toArray () übergeben haben.

Lassen Sie uns abschließend die Gleichheitsaussage machen und bestätigen, dass wir unser int- Array korrekt haben:

Stream integerStream = IntStream.rangeClosed(1, 7).boxed(); assertArrayEquals(new int[]{1, 2, 3, 4, 5, 6, 7}, intStreamToPrimitiveIntArray(integerStream));

Was ist, wenn wir das Gegenteil tun müssen? Lass uns einen Blick darauf werfen.

3. Konvertieren eines Arrays in einen Stream

Wir können natürlich auch den anderen Weg gehen. Und Java hat dafür einige spezielle Methoden.

3.1. Array von Objekten s

Wir können das Array in einem konvertieren Strom unter Verwendung Arrays.stream () oder Stream.of () Verfahren :

public Stream stringArrayToStreamUsingArraysStream(String[] stringArray) { return Arrays.stream(stringArray); } public Stream stringArrayToStreamUsingStreamOf(String[] stringArray) { return Stream.of(stringArray); }

Wir sollten beachten, dass in beiden Fällen unser Stream mit unserem Array übereinstimmt.

3.2. Array von Primitiven

Ebenso können wir ein Array von Grundelementen konvertieren:

public IntStream primitiveIntArrayToStreamUsingArraysStream(int[] intArray) { return Arrays.stream(intArray); } public Stream primitiveIntArrayToStreamUsingStreamOf(int[] intArray) { return Stream.of(intArray); }

Im Gegensatz zur Konvertierung der Arrays von Object gibt es jedoch einen wichtigen Unterschied. Wenn Primitiven Array Umwandeln Arrays.stream () kehrt IntStream , während Stream.of () kehrt Strom .

3.3. Arrays.stream vs. Stream.of

Um die in früheren Abschnitten erwähnten Unterschiede zu verstehen, werden wir uns die Implementierung der entsprechenden Methoden ansehen.

Lassen Sie uns zunächst einen Blick auf die Implementierung dieser beiden Methoden durch Java werfen:

public  Stream stream(T[] array) { return stream(array, 0, array.length); } public  Stream of(T... values) { return Arrays.stream(values); }

Wir können sehen, dass Stream.of () tatsächlich Arrays.stream () intern aufruft, und das ist offensichtlich der Grund, warum wir die gleichen Ergebnisse erhalten.

Jetzt werden wir die Methoden für den Fall überprüfen, dass wir ein Array von Grundelementen konvertieren möchten:

public IntStream stream(int[] array) { return stream(array, 0, array.length); } public  Stream of(T t) { return StreamSupport.stream(new Streams.StreamBuilderImpl(t), false); }

Diesmal Stream.of () nicht den Aufruf Arrays.stream () .

4. Fazit

In diesem Artikel haben wir gesehen, wie wir Streams in Arrays in Java konvertieren können und umgekehrt. Wir haben auch erklärt, warum wir beim Konvertieren eines Arrays von Objekten und beim Verwenden eines Arrays von Grundelementen unterschiedliche Ergebnisse erhalten .

Wie immer finden Sie den vollständigen Quellcode auf GitHub.