2010-07-20 27 views
87

Supongamos que tenemos un Collection<Foo>. ¿Cuál es la mejor forma (la más corta en LoC en el contexto actual) de transformarlo a Foo[]? Se permiten todas las bibliotecas bien conocidas de.¿La forma más fácil de transformar la colección en matriz?

UPD: (un caso más en esta sección, dejar comentarios si usted piensa que vale la pena para crear otro hilo para ello): ¿Qué pasa con la transformación de Collection<Foo> a Bar[] donde Bar tiene constructor con 1 parámetro de tipo Foo decir public Bar(Foo foo){ ... }?

Respuesta

205

Dónde x es la colección:

Foo[] foos = x.toArray(new Foo[x.size()]); 
+24

** ** simple (más fácil) pero no el mejor (memoria): 'x.toArray (new Foo [0])' --- ** documentación **: no hay tiempo para leer ... –

+0

La simplicidad es la clave ... creo que algunas personas se van a patear a sí mismas jeje – David

+5

@Carlos en realidad, usa mejor memoria que '(nuevo Foo [0])'. Según la documentación de Collection.toArray, '@param es la matriz en la que se almacenarán los elementos de esta colección, si es lo suficientemente grande ', lo que significa que los almacenará directamente en esa nueva matriz. Si le das una matriz de tamaño 0, creará una nueva matriz, lo que significa que tienes una pequeña matriz y una matriz grande que se creará cuando sea innecesario. – corsiKa

10

Si utiliza más de una vez o en un bucle, se podría definir una constante

public static final Foo[] FOO = new Foo[]{}; 

y hacer la conversión como si fuera

Foo[] foos = fooCollection.toArray(FOO); 

El método toArray tomará la matriz vacía para determinar e el tipo correcto de la matriz objetivo y crea una nueva matriz para ti.


aquí está mi propuesta para la actualización

Collection<Foo> foos = new ArrayList<Foo>(); 
Collection<Bar> temp = new ArrayList<Bar>(); 
for (Foo foo:foos) 
    temp.add(new Bar(foo)); 
Bar[] bars = temp.toArray(new Bar[]{}); 
+1

ups, 'const' no es Java! 'público estático final Foo [] FOO = {}' –

+1

¿por qué sería público? –

+0

@ Zoltán: ¿por qué no? Es inmutable, por lo que no presenta un problema de seguridad. Es un poco desordenado, pero podría ser útil en otros códigos, por lo que generalmente es inofensivo. Tal vez incluso cree una clase central con todas estas constantes, y luego use 'import static' para obtenerlas. – Jules

1

Para el original ver doublep respuesta:

Foo[] a = x.toArray(new Foo[x.size()]); 

En cuanto a la actualización:

int i = 0; 
Bar[] bars = new Bar[fooCollection.size()]; 
for(Foo foo : fooCollection) { // where fooCollection is Collection<Foo> 
    bars[i++] = new Bar(foo); 
}  
3

Aquí está la última solución para el caso en la actualización de la secta iones (con la ayuda de Google Colecciones):

Collections2.transform (fooCollection, new Function<Foo, Bar>() { 
    public Bar apply (Foo foo) { 
     return new Bar (foo); 
    } 
}).toArray (new Bar[fooCollection.size()]); 

embargo, el enfoque clave aquí se mencionó en the doublep's answer (me olvidé de toArray método).

+1

Consulte mi comentario sobre la respuesta de doublep sobre seguridad de hilos, que también se aplica a esta solución. 'new Bar [0]' evita el problema. – Jules

26

alternativa de solución a la cuestión actualizada utilizando Java 8:

Bar[] result = foos.stream() 
    .map(x -> new Bar(x)) 
    .toArray(size -> new Bar[size]); 
+25

Esto se puede acortar a 'Bar [] result = foos.stream(). Map (Bar :: new) .toArray (Bar [] :: new);' – lpandzic

+0

Sintaxis sabia Preferiría mucho la respuesta aceptada . Deseo que las personas puedan cambiar a Python. –

Cuestiones relacionadas