Angenommen, wir haben eine Collection<Foo>
. Was ist der beste (im aktuellen Kontext kürzeste in LoC) Weg, um es zu transformieren Foo[]
? Alle bekannten Bibliotheken sind erlaubt.
UPD: (ein weiterer Fall in diesem Abschnitt, Kommentare zu hinterlassen , wenn Sie denken , es lohnt sich einen weiteren Thread für sie zu schaffen): Was ist die Umwandlung Collection<Foo>
zu Bar[]
dem Bar
hat Konstruktor mit 1 Parameter vom Typ Foo
also public Bar(Foo foo){ ... }
?
java
arrays
collections
transformation
römisch
quelle
quelle
Stream.toArray
API aus dem JDK überein .Antworten:
Wo
x
ist die Sammlung:quelle
x.toArray(new Foo[0])
--- Dokumentation : keine Zeit zum Lesen ...(new Foo[0])
. Gemäß der Collection.toArray-Dokumentation ist "@param a das Array, in dem die Elemente dieser Sammlung gespeichert werden sollen, wenn sie groß genug sind", was bedeutet, dass sie direkt in diesem neuen Array gespeichert werden. Wenn Sie ihm ein Array der Größe 0 geben, wird ein neues Array erstellt. Dies bedeutet, dass ein kleines Array und ein großes Array erstellt werden, wenn dies nicht erforderlich ist.toArray
, um ein Zielarray des richtigen Typs zu erstellen. Und in diesem Fall würde mich ehrlich gesagt kein zusätzliches leeres Array in meiner Anwendung interessieren. Das liegt weit unter dem Geräuschpegel.new Foo[0]
einfacher ist "aber nicht am besten (Speicher)" ... das heißt, ich meinte, dass meine Lösung einfacher, aber nicht am besten ist (das ist der Grund, warum ich sie verwendet habe:
).new Foo[0]
von Carlos vorgeschlagene Variante leidet nicht unter diesem Problem.Alternative Lösung für die aktualisierte Frage mit Java 8:
quelle
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
Wenn Sie es mehrmals oder in einer Schleife verwenden, können Sie eine Konstante definieren
und mache die Konvertierung wie es ist
Die
toArray
Methode verwendet das leere Array, um den richtigen Typ des Zielarrays zu bestimmen und ein neues Array für Sie zu erstellen.Hier ist mein Vorschlag für das Update:
quelle
const
ist nicht Java!public static final Foo[] FOO = {}
import static
, um an sie heranzukommen.Bei JDK / 11 besteht eine alternative Möglichkeit zum Konvertieren von a
Collection<Foo>
in aFoo[]
darin, Folgendes zu verwendenCollection.toArray(IntFunction<T[]> generator)
:Wie von @Stuart auf der Mailingliste (Schwerpunkt Mine) erläutert , sollte die Leistung im Wesentlichen die gleiche sein wie die der vorhandenen
Collection.toArray(new T[0])
-Die Implementierung der API im JDK lautet:
Hinweis : - Nur, dass die API-Verwendung mit einer Abwärtsinkompatibilität einhergeht, wenn sie für Code mit
null
Werten verwendet wird, z. B.toArray(null)
da diese Aufrufe jetzt aufgrund vorhandener Aufrufe mehrdeutig sindtoArray(T[] a)
und nicht kompiliert werden können.quelle
Wenn Sie Guava in Ihrem Projekt verwenden, können Sie verwenden
Iterables::toArray
.quelle
Für das Original siehe doppelte Antwort:
Wie für das Update:
quelle
Hier ist die endgültige Lösung für den Fall im Update-Bereich (mithilfe von Google Collections):
Aber der Schlüsselansatz hier wurde in der Antwort des Doubleps erwähnt (ich habe die
toArray
Methode vergessen ).quelle
new Bar[0]
vermeidet das Problem.Beispiel: Sie haben eine Sammlung ArrayList mit Elementen. Schülerklasse:
quelle