2014-02-12 6 views
24

Was ich suche ist eine generische Version von Object[] java.util.Collection.toArray() oder eine weniger ausführliche Alternative zur Verwendung von T[] java.util.Collection.toArray(T[] array). Ich kann zur Zeit schreiben:Gibt es eine generische Version von toArray() in Guava oder Apache Commons Collections?

Collection<String> strings; 
String[] array = strings.toArray(new String[strings.size()]); 

Was ich suche ist so etwas wie:

@SuppressWarnings("unchecked") 
public static <T> T[] toArray(Collection<T> collection, Class<T> clazz) { 
    return collection.toArray((T[]) Array.newInstance(clazz, collection.size())); 
} 

, die ich dann als verwenden:

String[] array = Util.toArray(strings, String.class); 

So etwas wie dies umgesetzt ist in Guava oder in Commons Sammlungen?

Natürlich kann ich meine eigenen (die oben genannten) schreiben, die so schnell zu Array (T [] Array) scheint.

+0

Also im Grunde sind Sie einfach nicht in der 'array' Parameter zu setzen haben wollen, aber Sie sind glücklich, einen Klassennamen für eine statische Methode zu setzen und ein Klassenliteral stattdessen? – chrylis

+0

Die Tatsache, dass Sie eine Anzahl von Zeichen, die der Länge von 'strings.size() 'entsprechen, reduzieren möchten, würde bedeuten, dass Sie diese Konvertierung ziemlich viel durchführen. Also ist die Antwort, mach es weniger. –

+0

Sie machen sich Sorgen, weil 8 weitere Charaktere viel sind? –

Antwort

7

Sie können es verkürzen mit

String[] array = strings.toArray(new String[0]); 

die auch effizienter sein geschieht.

Mit Java 8 Sie können dies auch nutzen, aber es scheint unnötig kompliziert und ist wahrscheinlich langsamer:

String[] array = strings.stream().toArray(String[]::new);  // Java 8 
+0

Danke. Allerdings kann ich weder Java 8 verwenden, noch möchte ich unnötigerweise Objekte auf speicherbeschränkten Geräten (Android) mit 'strings.toArray (new String [0])' erstellen. Außerdem sind diese Lösungen nicht viel besser lesbar als 'strings.toArray (new String [strings.size()])'. – Mihai

+4

Wenn diese 'neuen String [0]' s überhaupt etwas für deine Performance bedeuten, herzlichen Glückwunsch, du musst eine schnell schreiende App haben. –

+1

'neue Zeichenfolge [0]' wird tatsächlich schneller sein: https://shipilev.net/blog/2016/arrays-wisdom-ancients/ –

2

Die Guava Syntax ist speziell

Iterables.toArray(strings, String.class); 
Verwandte Themen