Convirtiendo una matriz de objetos a una matriz de sus tipos primitivos

Si tiene una matriz de objetos Java que tienen un tipo primitivo (por ejemplo, Byte, Integer, Char, etc.). ¿Hay alguna forma clara de convertirlo en una matriz del tipo primitivo? En particular, esto se puede hacer sin tener que crear una nueva matriz y recorrer los contenidos.

Entonces, por ejemplo, dado

Integer[] array 

¿Cuál es la mejor forma de convertir esto en

 int[] intArray 

Desafortunadamente, esto es algo que tenemos que hacer con bastante frecuencia cuando interactuamos entre Hibernate y algunas bibliotecas de terceros sobre las cuales no tenemos control. Parece que esta sería una operación bastante común, así que me sorprendería si no hay atajos.

¡Gracias por tu ayuda!

Desafortunadamente, no hay nada en la plataforma Java que haga esto. Por cierto, también necesitas manejar explícitamente elementos null en la matriz Integer[] (¿qué int vas a usar para esos?).

Una vez más, Apache Commons Lang es tu amigo. Proporcionan ArrayUtils.toPrimitive () que hace exactamente lo que necesita. Puede especificar cómo desea manejar nulos.

Con streams introducidos en Java 8 esto se puede hacer:

 int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray(); 

Sin embargo, actualmente solo existen flujos primitivos para int , long y double . Si necesita convertir a otro tipo primitivo como byte el camino más corto sin una biblioteca externa, esto es:

 byte[] byteArray = new byte[array.length]; for(int i = 0; i < array.length; i++) byteArray[i] = array[i]; 

O el bucle for se puede reemplazar con un flujo si lo desea:

 IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]); 

Todos estos arrojarán una NullPointerException si alguno de tus elementos es null .

Usando Guava :

 int[] intArray = Ints.toArray(Arrays.asList(array)); 

Documentación:

  • Arrays.asList (API principal)
  • Ints.toArray (Guava)

En particular, esto se puede hacer sin tener que crear una nueva matriz y recorrer los contenidos.

No puede convertir una matriz de entero a int (es decir, no puede cambiar el tipo de los elementos de una matriz) en Java. Entonces, debes crear una nueva matriz int [] y copiar el valor de los objetos Integer en ella o puedes usar un adaptador:

 class IntAdapter { private Integer[] array; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index].intValue(); } } 

Esto puede hacer que su código sea un poco más legible y el objeto IntAdapter solo consumirá unos pocos bytes de memoria. La gran ventaja de un adaptador es que puede manejar casos especiales aquí:

 class IntAdapter { private Integer[] array; public int nullValue = 0; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index] == null ? nullValue : array[index].intValue(); } } 

Otra solución es usar Commons Primitives que contiene muchos adaptadores predefinidos. En tu caso, echa un vistazo a ListIntList .

O simplemente hazlo de la manera fácil si vas a hacerlo solo una vez. ¡Pero no ha hablado de Integer! = Caso nulo.

  //array is the Integer array int[] array2 = new int[array.length]; int i=0; for (Integer integer : array) { array2[i] = integer.intValue(); i++; } 

usar Dollar es simple como:

 Integer[] array = ...; int[] primitiveArray = $(array).toIntArray();