Estoy tratando de convertir una ArrayList que contiene objetos Integer en primitivo int [] con el siguiente fragmento de código, pero arroja un error de tiempo de compilación. ¿Es posible convertir en Java?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
java
arrays
arraylist
primitive-types
Snehal
fuente
fuente
List<Integer> x = new ArrayList<Integer>();
Integer[] n = x.toArray(new Integer[0]);
Respuestas:
Puede convertir, pero no creo que haya nada incorporado para hacerlo automáticamente:
(Tenga en cuenta que esto arrojará una NullPointerException si alguno
integers
o cualquier elemento dentro de él esnull
).EDITAR: según los comentarios, es posible que desee utilizar el iterador de lista para evitar costos desagradables con listas como
LinkedList
:fuente
integers.stream().mapToInt(Integer::valueOf).toArray
Si estas usando java-8 También hay otra forma de hacer esto.
Lo que hace es:
Stream<Integer>
de la listaIntStream
mapeo de cada elemento a sí mismo (función de identidad), desempaquetar elint
valor retenido por cadaInteger
objeto (hecho automáticamente desde Java 5)int
llamandotoArray
También puede llamar explícitamente a
intValue
través de una referencia de método, es decir:También vale la pena mencionar que podría obtener un
NullPointerException
si tiene algunanull
referencia en la lista. Esto podría evitarse fácilmente agregando una condición de filtrado a la tubería de flujo de esta manera:Ejemplo:
fuente
double
tipos; ¿No hay equivalente para losfloat
tipos?Google guayaba
Google Guava proporciona una forma ordenada de hacer esto llamando
Ints.toArray
.fuente
Apache Commons tiene una clase ArrayUtils, que tiene un método toPrimitive () que hace exactamente esto.
Sin embargo, como demostró Jon, es bastante fácil hacerlo usted mismo en lugar de usar bibliotecas externas.
fuente
Creo que iterar usando el iterador de la Lista es una mejor idea, ya que
list.get(i)
puede tener un bajo rendimiento dependiendo de la implementación de la Lista:fuente
usar Dollar debería ser bastante simple:
Estoy planeando mejorar el DSL para eliminar la
toArray()
llamada intermediafuente
Esto funciona bien para mí :)
Encontrado en https://www.techiedelight.com/convert-list-integer-array-int/
fuente
Me desconcierta que fomentemos métodos personalizados únicos cuando una biblioteca perfectamente buena y bien utilizada como Apache Commons ya haya resuelto el problema. Aunque la solución es trivial si no es absurda, es irresponsable fomentar ese comportamiento debido al mantenimiento y la accesibilidad a largo plazo.
Solo ve con Apache Commons
fuente
Si está utilizando Eclipse Collections , puede utilizar el
collectInt()
método para cambiar de un contenedor de objetos a un contenedor int primitivo.Si puede convertir su
ArrayList
aFastList
, puede deshacerse del adaptador.Nota: Soy un committer para las colecciones de Eclipse.
fuente
Java 8:
fuente
Arrays.setAll ()
Salida:
Lo mismo funciona para una gran variedad de
long
odouble
, pero no para las matrices deboolean
,char
,byte
,short
ofloat
. Si tienes una lista realmente enorme, incluso hay unparallelSetAll
método que puedes usar en su lugar.Para mí, esto es lo suficientemente bueno y elegante como para que no quiera obtener una biblioteca externa ni usar secuencias para ella.
Enlace de documentación:
Arrays.setAll(int[], IntUnaryOperator)
fuente
Simplemente puede copiarlo a una matriz:
No muy elegante; pero, oye, funciona ...
fuente
Una solución muy simple de una línea es:
fuente
Este segmento de código funciona para mí, prueba esto:
Vale la pena mencionar que ArrayList debería declararse así:
fuente
fuente
Acceso
arr
como normalint[]
.fuente