¿Cómo convertir una ArrayList que contiene números enteros en una matriz int primitiva?

Resuelto Snehal asked hace 15 años • 20 respuestas

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()]);
Snehal avatar Apr 05 '09 14:04 Snehal
Aceptado

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 IntStreammapeando cada elemento a sí mismo (función de identidad), desempaquetando el intvalor retenido por cada Integerobjeto (hecho automáticamente desde Java 5)
  • obteniendo la matriz intde llamandotoArray

También puedes llamar explícitamente intValuea 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 NullPointerExceptionsi tienes alguna nullreferencia 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]
Alexis C. avatar May 15 '2014 21:05 Alexis C.

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 integersde 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;
}
Jon Skeet avatar Apr 05 '2009 08:04 Jon Skeet