¿Cómo convertir una ArrayList que contiene números enteros en una matriz int primitiva?
Estoy intentando convertir un ArrayList que contiene objetos Integer a int[] primitivo con el siguiente 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()]);
Si estas usandojava-8También hay otra manera de hacer esto.
int[] arr = list.stream().mapToInt(i -> i).toArray();
Lo que hace es:
- obteniendo un
Stream<Integer>
de la lista - obteniendo un
IntStream
mapeando cada elemento a sí mismo (función de identidad), desempaquetando elint
valor retenido por cadaInteger
objeto (hecho automáticamente desde Java 5) - obteniendo la matriz
int
de llamandotoArray
También puedes llamar explícitamente intValue
a través de una referencia de método, es decir:
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
También vale la pena mencionar que puedes obtener un NullPointerException
si tienes alguna null
referencia en la lista. Esto podría evitarse fácilmente agregando una condición de filtrado a la canalización de flujo como esta:
//.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();
Ejemplo:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]
list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]
Puedes convertir, pero no creo que haya nada integrado para hacerlo automáticamente:
public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
for (int i=0; i < ret.length; i++)
{
ret[i] = integers.get(i).intValue();
}
return ret;
}
(Tenga en cuenta que esto generará una excepción NullPointerException si alguno integers
de los elementos que contiene es null
.)
EDITAR: Según los comentarios, es posible que desee utilizar el iterador de lista para evitar costos desagradables con listas como LinkedList
:
public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
Iterator<Integer> iterator = integers.iterator();
for (int i = 0; i < ret.length; i++)
{
ret[i] = iterator.next().intValue();
}
return ret;
}