una - matrices en java
Convirtiendo una matriz de objetos a una matriz de sus tipos primitivos (7)
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!
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 .
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
.
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?).
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++;
}
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.
Usando Guava :
int[] intArray = Ints.toArray(Arrays.asList(array));
Documentación:
-
Arrays.asList
(API principal) -
Ints.toArray
(Guava)
usar Dollar es simple como:
Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();