Was ist der einfachste / kürzeste Weg, um Java 8 Stream
in ein Array zu konvertieren ?
java
arrays
java-8
java-stream
MC Kaiser
quelle
quelle
Antworten:
Die einfachste Methode besteht darin, die
toArray(IntFunction<A[]> generator)
Methode mit einer Array-Konstruktorreferenz zu verwenden. Dies wird in der API-Dokumentation für die Methode vorgeschlagen .Es wird eine Methode gefunden, die eine Ganzzahl (die Größe) als Argument verwendet und a zurückgibt
String[]
, was genau das ist, was (eine der Überladungen von)new String[]
tut.Sie können auch Ihre eigenen schreiben
IntFunction
:Der Zweck von
IntFunction<A[]> generator
ist das Konvertieren einer Ganzzahl, der Größe des Arrays, in ein neues Array.Beispielcode:
Drucke:
quelle
toArray(sz -> new String[sz])
also bin ich mir nicht sicher, ob man wirklich sagen kann, was die Lösung sein sollte oder muss.sz -> new String[sz]
macht eine neue Funktion, wo dies als Konstruktorreferenz nicht der Fall ist. Es hängt davon ab, wie sehr Sie Garbage Collection Churn schätzen, denke ich.private
Methode , die keine Abwanderung verursachen kann, und beide Versionen müssen ein neues Objekt erstellen. Eine Referenz erstellt ein Objekt, das direkt auf die Zielmethode zeigt. Ein Lambda erstellt ein Objekt, das auf das generierte zeigtprivate
. Ein Verweis auf einen Konstruktor sollte aufgrund mangelnder Indirektion und einfacherer VM-Optimierung immer noch eine bessere Leistung erbringen, aber Churning hat nichts damit zu tun.Wenn Sie ein Array von Ints mit den Werten 1 bis 10 aus einem Stream abrufen möchten, steht Ihnen IntStream zur Verfügung.
Hier erstellen wir einen Stream mit einer Stream.of-Methode und konvertieren einen Stream mithilfe von mapToInt in einen IntStream. Dann können wir die toArray-Methode von IntStream aufrufen.
Hier ist das Gleiche ohne den Stream, der nur den IntStream verwendet
quelle
Mit diesem einfachen Codeblock können Sie einen Java 8-Stream in ein Array konvertieren:
Aber lassen Sie uns die Dinge näher erläutern. Lassen Sie uns zunächst eine Liste von Zeichenfolgen erstellen, die mit drei Werten gefüllt sind:
Erstellen Sie einen Stream aus dem angegebenen Array:
Wir können jetzt einige Operationen an diesem Stream ausführen.
und konvertieren Sie es schließlich mit den folgenden Methoden in ein Java 8-Array:
1-Klassische Methode (Funktionsschnittstelle)
2-Lambda-Ausdruck
3- Methodenreferenz
Methodenreferenz Erläuterung:
Es ist eine andere Art, einen Lambda-Ausdruck zu schreiben, der dem anderen genau entspricht.
quelle
Konvertieren Sie Text in ein Zeichenfolgenarray, in dem jeder Wert durch Komma getrennt wird, und schneiden Sie jedes Feld ab. Beispiel:
quelle
Sie können einen benutzerdefinierten Kollektor erstellen, der einen Stream in ein Array konvertiert.
und eine schnelle Verwendung
quelle
Collectors.groupingBy
damit ich Arrays von Objekten pro Attributwert ein Attribut zuordnen konnte. Diese Antwort gibt mir genau das. Auch @DidierL.Die Verwendung der
toArray(IntFunction<A[]> generator)
Methode ist in der Tat eine sehr elegante und sichere Methode, um einen Stream in ein Array des gleichen Stream-Typs zu konvertieren (oder genauer gesagt zu sammeln).Wenn der Typ des zurückgegebenen Arrays jedoch nicht wichtig ist, ist die einfache Verwendung der
toArray()
Methode sowohl einfacher als auch kürzer. Zum Beispiel:quelle
quelle
Probieren Sie es online aus: https://repl.it/@SmaMa/Stream-to-array
quelle
quelle
Sie können dies auf verschiedene Arten tun. Alle Möglichkeiten sind technisch gleich, aber die Verwendung von Lambda würde einen Teil des Codes vereinfachen. Nehmen wir an, wir initialisieren eine Liste zuerst mit String und nennen sie Personen.
Jetzt können Sie eine der folgenden Möglichkeiten verwenden.
Verwenden des Lambda-Ausdrucks zum Erstellen eines neuen StringArray mit definierter Größe.
String [] stringArray = stream.toArray (Größe-> neuer String [Größe]);
Verwenden Sie die Methodenreferenz direkt.
String [] stringArray = stream.toArray (String [] :: new);
quelle