Habe diese Antwort mit einem aktualisierten Ansatz mit JDK-11 gemacht , der eine neue, ebenso leistungsfähige API mit toArray(T[])ähnlicher Syntax wie einführt Stream.toArray.
Naman
Antworten:
1790
List<String> list =..;String[] array = list.toArray(newString[0]);
Zum Beispiel:
List<String> list =newArrayList<String>();//add some stuff
list.add("android");
list.add("apple");String[] stringArray = list.toArray(newString[0]);
Die toArray()Methode ohne Übergabe eines Arguments wird zurückgegeben Object[]. Sie müssen also ein Array als Argument übergeben, das mit den Daten aus der Liste gefüllt und zurückgegeben wird. Sie können auch ein leeres Array übergeben, aber Sie können auch ein Array mit der gewünschten Größe übergeben.
Wichtiges Update : Ursprünglich wurde der oben genannte Code verwendet new String[list.size()]. Dieser Blogpost zeigt jedoch, dass die Verwendung aufgrund von JVM-Optimierungen new String[0]jetzt besser ist.
Es stellt sich heraus, dass das Bereitstellen eines Arrays mit der Länge Null, selbst das Erstellen und Wegwerfen, im Durchschnitt schneller ist als das Zuweisen eines Arrays mit der richtigen Größe. Für Benchmarks und Erklärungen siehe hier: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks
2
(Sorry. Rhetorische Frage. Die Antwort ist natürlich, weil Java keine echten Generika macht; es fälscht sie meistens nur durch das
Wirken
3
@lyuboslavkanev Das Problem ist, dass der generische Typ in Java nicht ausreicht, um tatsächlich Objekte basierend auf diesem Typ zu erstellen. nicht einmal ein Array (was lächerlich ist, weil das für jeden Typ funktionieren sollte ). Soweit ich sehen kann, ist damit nur Casting möglich. Um überhaupt Objekte des Typs zu erstellen, benötigen Sie das eigentliche ClassObjekt, das sich möglicherweise nicht vollständig vom generischen Typ ableiten lässt. Der Grund dafür ist, wie gesagt, dass die gesamte Konstruktion gefälscht ist; Es wird alles nur intern als Objekt gespeichert.
Ich würde diese Syntax bevorzugen, aber IntelliJ zeigt damit einen Compilerfehler an und beschwert sich "T [] ist keine funktionale Schnittstelle".
Glen Mazza
3
@GlenMazza können Sie nur toArrayfür ein StreamObjekt verwenden. Dieser Kompilierungsfehler kann auftreten, wenn Sie den Stream mit a reduzieren Collectorsund dann versuchen, ihn anzuwenden toArray.
Udara Bentota
39
Sie können die toArray()Methode verwenden für List:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array = list.toArray(newString[list.size()]);
Oder Sie können die Elemente manuell zu einem Array hinzufügen:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array =newString[list.size()];for(int i =0; i < list.size(); i++){
array[i]= list.get(i);}
List<String> list =List.of("x","y","z");String[] arrayBeforeJDK11 = list.toArray(newString[0]);String[] arrayAfterJDK11 = list.toArray(String[]::new);// similar to Stream.toArray
Dies funktioniert, ist aber nicht sehr effizient und dupliziert die Funktionalität in der akzeptierten Antwort mit zusätzlichem Code.
Alan Delimon
5
Falls eine zusätzliche Manipulation der Daten gewünscht wird, für die der Benutzer eine Funktion wünscht, ist dieser Ansatz nicht perfekt (da die Klasse des Elements als zweiter Parameter übergeben werden muss), sondern funktioniert:
Wenn Ihre Anwendung bereits Apache Commons lib verwendet, können Sie die akzeptierte Antwort leicht ändern, um nicht jedes Mal ein neues leeres Array zu erstellen:
List<String> list =..;String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);// or if using static importString[] array = list.toArray(EMPTY_STRING_ARRAY);
Es gibt einige weitere vorab zugewiesene leere Arrays verschiedener Typen in ArrayUtils.
Wir können JVM auch dazu bringen, ein leeres Array für uns zu erstellen:
String[] array = list.toArray(ArrayUtils.toArray());// or if using static importString[] array = list.toArray(toArray());
Aber auf diese Weise gibt es wirklich keinen Vorteil, nur Geschmackssache, IMO.
Ich habe herabgestimmt, weil: 1. keine Generika verwendet werden, die Sie dazu zwingen, 2. zu verwenden, .toString()wo keine explizite Besetzung erforderlich wäre, 3. Sie nicht einmal inkrementieren iund 4. das whilebesser dran wäre, durch a ersetzt zu werden for. Vorgeschlagener Code:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Olivier Grégoire
Okay, ich habe es jetzt verstanden. Vielen Dank.
Vatsal Chavda
Im Idealfall sollten Sie Ihren Code so bearbeiten, dass er diese Kommentare enthält (das heißt, wenn Sie der Meinung sind, dass sie für Ihre Antwort gut sind!). Ich werde nicht in Betracht ziehen, meine Downvote zu entfernen, solange der Code unverändert bleibt.
Olivier Grégoire
Ich bin neu hier, also weiß ich noch nicht, wie die Dinge hier funktionieren. Aber schätzen Sie Ihre Hilfe Kumpel.
Vatsal Chavda
Das ist viel besser! Ich habe nur ein bisschen bearbeitet, aber Sie haben gerade erfahren, wie es funktioniert: Antwort geben, verbessern, Lorbeeren holen;)
Olivier Grégoire
5
In Java 11 können wir die Collection.toArray(generator)Methode verwenden. Der folgende Code erstellt ein neues Array von Zeichenfolgen:
List<String> list =List.of("one","two","three");String[] array = list.toArray(String[]::new)
List<String> list =newArrayList<>();
list.add("a");
list.add("b");
list.add("c");String[] strArry= list.stream().toArray(size ->newString[size]);
Per Kommentar habe ich einen Absatz hinzugefügt, um zu erklären, wie die Konvertierung funktioniert. Zunächst wird List in einen String-Stream konvertiert. Anschließend wird Stream.toArray verwendet, um die Elemente im Stream in ein Array zu konvertieren. In der letzten obigen Anweisung ist "size -> new String [size]" eine IntFunction-Funktion, die ein String-Array mit der Größe des String-Streams zuweist. Die Aussage ist identisch mit
toArray(T[])
ähnlicher Syntax wie einführtStream.toArray
.Antworten:
Zum Beispiel:
Die
toArray()
Methode ohne Übergabe eines Arguments wird zurückgegebenObject[]
. Sie müssen also ein Array als Argument übergeben, das mit den Daten aus der Liste gefüllt und zurückgegeben wird. Sie können auch ein leeres Array übergeben, aber Sie können auch ein Array mit der gewünschten Größe übergeben.Wichtiges Update : Ursprünglich wurde der oben genannte Code verwendet
new String[list.size()]
. Dieser Blogpost zeigt jedoch, dass die Verwendung aufgrund von JVM-Optimierungennew String[0]
jetzt besser ist.quelle
Class
Objekt, das sich möglicherweise nicht vollständig vom generischen Typ ableiten lässt. Der Grund dafür ist, wie gesagt, dass die gesamte Konstruktion gefälscht ist; Es wird alles nur intern als Objekt gespeichert.Eine Alternative in Java 8:
Java 11+:
quelle
toArray
für einStream
Objekt verwenden. Dieser Kompilierungsfehler kann auftreten, wenn Sie den Stream mit a reduzierenCollectors
und dann versuchen, ihn anzuwendentoArray
.Sie können die
toArray()
Methode verwenden fürList
:Oder Sie können die Elemente manuell zu einem Array hinzufügen:
Hoffe das hilft!
quelle
Mit copyOf kann ArrayList auch für Arrays ausgeführt werden.
quelle
Ausgehend von Java-11 kann alternativ die API verwendet werden
Collection.toArray(IntFunction<T[]> generator)
, um Folgendes zu erreichen:quelle
In Java 8:
quelle
parallelStream()
statt einfachstream()
?In Java 8 kann dies mit erfolgen
quelle
Generics Lösung verdeckte jede
List<Type>
anString []
:Hinweis Sie müssen
override toString()
Methode.quelle
quelle
Falls eine zusätzliche Manipulation der Daten gewünscht wird, für die der Benutzer eine Funktion wünscht, ist dieser Ansatz nicht perfekt (da die Klasse des Elements als zweiter Parameter übergeben werden muss), sondern funktioniert:
import java.util.ArrayList; import java.lang.reflect.Array;
quelle
Wenn Ihre Anwendung bereits Apache Commons lib verwendet, können Sie die akzeptierte Antwort leicht ändern, um nicht jedes Mal ein neues leeres Array zu erstellen:
Es gibt einige weitere vorab zugewiesene leere Arrays verschiedener Typen in
ArrayUtils
.Wir können JVM auch dazu bringen, ein leeres Array für uns zu erstellen:
Aber auf diese Weise gibt es wirklich keinen Vorteil, nur Geschmackssache, IMO.
quelle
Sie können verwenden
Iterator<String>
, um die Elemente vonArrayList<String>
:Jetzt können Sie Elemente aus
String[]
jeder Schleife abrufen .quelle
.toString()
wo keine explizite Besetzung erforderlich wäre, 3. Sie nicht einmal inkrementiereni
und 4. daswhile
besser dran wäre, durch a ersetzt zu werdenfor
. Vorgeschlagener Code:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
In Java 11 können wir die
Collection.toArray(generator)
Methode verwenden. Der folgende Code erstellt ein neues Array von Zeichenfolgen:von java.base's
java.util.Collection.toArray()
.quelle
Per Kommentar habe ich einen Absatz hinzugefügt, um zu erklären, wie die Konvertierung funktioniert. Zunächst wird List in einen String-Stream konvertiert. Anschließend wird Stream.toArray verwendet, um die Elemente im Stream in ein Array zu konvertieren. In der letzten obigen Anweisung ist "size -> new String [size]" eine IntFunction-Funktion, die ein String-Array mit der Größe des String-Streams zuweist. Die Aussage ist identisch mit
quelle
Mit dieser Methode können Sie List in String Array konvertieren:
Das vollständige Beispiel:
quelle
quelle