He respondido esta respuesta con un enfoque actualizado con JDK-11 introduciendo una nueva API igualmente eficiente toArray(T[])y similar en sintaxis Stream.toArray.
Naman
Respuestas:
1792
List<String> list =..;String[] array = list.toArray(newString[0]);
Por ejemplo:
List<String> list =newArrayList<String>();//add some stuff
list.add("android");
list.add("apple");String[] stringArray = list.toArray(newString[0]);
El toArray()método sin pasar ningún argumento devuelve Object[]. Por lo tanto, debe pasar una matriz como argumento, que se completará con los datos de la lista y se devolverá. También puede pasar una matriz vacía, pero también puede pasar una matriz con el tamaño deseado.
Actualización importante : originalmente se utilizó el código anterior new String[list.size()]. Sin embargo, esta publicación de blog revela que debido a las optimizaciones de JVM, el uso new String[0]es mejor ahora.
Resulta que proporcionar una matriz de longitud cero, incluso crearla y tirarla, es en promedio más rápido que asignar una matriz del tamaño correcto. Para ver los puntos de referencia y la explicación, consulte aquí: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks
2
(Lo siento. Pregunta retórica. La respuesta es, por supuesto, porque Java no hace genéricos reales; en su mayoría solo los falsifica al lanzar Object)
Nyerguds
3
@lyuboslavkanev El problema es que tener el tipo genérico en Java no es suficiente para crear objetos basados en ese tipo; ni siquiera una matriz (lo cual es ridículo, porque eso debería funcionar para cualquier tipo). Todo lo que se puede hacer con él, hasta donde puedo ver, es el casting. De hecho, incluso para crear objetos del tipo, debe tener el Classobjeto real , que parece ser completamente imposible de derivar del tipo genérico. La razón de esto, como dije, es que toda la construcción es falsa; todo se almacena internamente como Objeto.
Preferiría esa sintaxis, pero IntelliJ muestra un error de compilación con eso, se queja "T [] no es una interfaz funcional".
Glen Mazza
3
@GlenMazza solo se puede usar toArrayen un Streamobjeto. Este error de compilación puede ocurrir si reduce la secuencia usando a Collectorsy luego intenta aplicar toArray.
Udara Bentota
39
Puedes usar el toArray()método para List:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array = list.toArray(newString[list.size()]);
O puede agregar manualmente los elementos a una matriz:
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
Esto realmente ya está contenido en esta respuesta . Quizás lo agregue como una edición a esa respuesta en lugar de como una respuesta completamente nueva.
Río
11
¿Por qué en parallelStream()lugar de simplemente stream()?
Esto funciona, pero no es súper eficiente, y duplica la funcionalidad en la respuesta aceptada con código adicional.
Alan Delimon
5
en caso de que se desee una manipulación adicional de los datos, para lo cual el usuario desea una función, este enfoque no es perfecto (ya que requiere pasar la clase del elemento como segundo parámetro), pero funciona:
Si su aplicación ya está usando la biblioteca Apache Commons, puede modificar ligeramente la respuesta aceptada para no crear una nueva matriz vacía cada vez:
List<String> list =..;String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);// or if using static importString[] array = list.toArray(EMPTY_STRING_ARRAY);
Hay algunas más matrices vacías preasignadas de diferentes tipos en ArrayUtils.
También podemos engañar a JVM para crear una matriz vacía para nosotros de esta manera:
String[] array = list.toArray(ArrayUtils.toArray());// or if using static importString[] array = list.toArray(toArray());
Pero realmente no hay ventaja de esta manera, solo es cuestión de gustos, en mi opinión.
Voté en contra porque: 1. no usas genéricos que te obligan a usar 2. usar .toString()donde no se necesitaría un lanzamiento explícito, 3. ni siquiera incrementas i, y 4. whilesería mejor reemplazarlo por a for. Código sugerido: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
Está bien, lo tengo ahora. Gracias.
Vatsal Chavda
Bueno, idealmente, debe editar su código para incluir esos comentarios (es decir ... ¡si cree que son buenos para su respuesta!). No consideraré eliminar mi voto negativo mientras el código permanezca sin cambios.
Olivier Grégoire
Soy nuevo aquí, así que aún no sé cómo funcionan las cosas aquí. Aunque, agradezco su ayuda compañero.
Vatsal Chavda
¡Esto es mucho mejor! He editado solo un poco, pero acabas de experimentar cómo funciona: dar respuesta, mejorarlos, obtener los laureles;)
Olivier Grégoire
5
En Java 11, podemos usar el Collection.toArray(generator)método. El siguiente código creará una nueva matriz de cadenas:
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]);
Por comentarios, he agregado un párrafo para explicar cómo funciona la conversión. Primero, la lista se convierte en una secuencia de cadena. Luego usa Stream.toArray para convertir los elementos en la secuencia a una matriz. En la última declaración anterior, "size -> new String [size]" es en realidad una función IntFunction que asigna una matriz String con el tamaño de la secuencia String. La declaración es idéntica a
toArray(T[])
y similar en sintaxisStream.toArray
.Respuestas:
Por ejemplo:
El
toArray()
método sin pasar ningún argumento devuelveObject[]
. Por lo tanto, debe pasar una matriz como argumento, que se completará con los datos de la lista y se devolverá. También puede pasar una matriz vacía, pero también puede pasar una matriz con el tamaño deseado.Actualización importante : originalmente se utilizó el código anterior
new String[list.size()]
. Sin embargo, esta publicación de blog revela que debido a las optimizaciones de JVM, el usonew String[0]
es mejor ahora.fuente
Class
objeto real , que parece ser completamente imposible de derivar del tipo genérico. La razón de esto, como dije, es que toda la construcción es falsa; todo se almacena internamente como Objeto.Una alternativa en Java 8:
Java 11+:
fuente
toArray
en unStream
objeto. Este error de compilación puede ocurrir si reduce la secuencia usando aCollectors
y luego intenta aplicartoArray
.Puedes usar el
toArray()
método paraList
:O puede agregar manualmente los elementos a una matriz:
¡Espero que esto ayude!
fuente
Usando copyOf, ArrayList a las matrices también se puede hacer.
fuente
A partir de Java-11, uno puede usar alternativamente la API
Collection.toArray(IntFunction<T[]> generator)
para lograr lo mismo que:fuente
En Java 8:
fuente
parallelStream()
lugar de simplementestream()
?En Java 8, se puede hacer usando
fuente
Solución genérica para convertir cualquiera
List<Type>
aString []
:Nota Debe
override toString()
método.fuente
fuente
en caso de que se desee una manipulación adicional de los datos, para lo cual el usuario desea una función, este enfoque no es perfecto (ya que requiere pasar la clase del elemento como segundo parámetro), pero funciona:
import java.util.ArrayList; import java.lang.reflect.Array;
fuente
Si su aplicación ya está usando la biblioteca Apache Commons, puede modificar ligeramente la respuesta aceptada para no crear una nueva matriz vacía cada vez:
Hay algunas más matrices vacías preasignadas de diferentes tipos en
ArrayUtils
.También podemos engañar a JVM para crear una matriz vacía para nosotros de esta manera:
Pero realmente no hay ventaja de esta manera, solo es cuestión de gustos, en mi opinión.
fuente
Puede usar
Iterator<String>
para iterar los elementos deArrayList<String>
:Ahora puede recuperar elementos del
String[]
uso de cualquier bucle.fuente
.toString()
donde no se necesitaría un lanzamiento explícito, 3. ni siquiera incrementasi
, y 4.while
sería mejor reemplazarlo por afor
. Código sugerido: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(); }
En Java 11, podemos usar el
Collection.toArray(generator)
método. El siguiente código creará una nueva matriz de cadenas:de java.base's
java.util.Collection.toArray()
.fuente
Por comentarios, he agregado un párrafo para explicar cómo funciona la conversión. Primero, la lista se convierte en una secuencia de cadena. Luego usa Stream.toArray para convertir los elementos en la secuencia a una matriz. En la última declaración anterior, "size -> new String [size]" es en realidad una función IntFunction que asigna una matriz String con el tamaño de la secuencia String. La declaración es idéntica a
fuente
Puede convertir la lista a la matriz de cadenas utilizando este método:
El ejemplo completo:
fuente
fuente