Si vous avez un tableau de Java objets qui ont un type primitif (par exemple Byte, Integer, Char, etc.). Existe-t-il un moyen pratique de le convertir en un tableau de type primitif ? En particulier, cela peut être fait sans avoir à créer un nouveau tableau et à parcourir le contenu.
Ainsi, par exemple, étant donné
Integer[] array
quelle est la meilleure façon de convertir cela en
int[] intArray
Malheureusement, c'est quelque chose que nous devons faire assez fréquemment lors de l'interfaçage entre Hibernate et certaines bibliothèques tierces sur lesquelles nous n'avons aucun contrôle. Il semble que ce serait une opération assez courante, donc je serais surpris s'il n'y avait pas de raccourci.
Merci de votre aide!
Malheureusement, il n'y a rien dans la plate-forme Java qui fait cela. Btw, vous devez également gérer explicitement les éléments null
dans les Integer[]
array (quel int
allez-vous utiliser pour ceux-ci?).
Encore une fois, Apache Commons Lang est votre ami. Ils fournissent ArrayUtils.toPrimitive () qui fait exactement ce dont vous avez besoin. Vous pouvez spécifier comment vous souhaitez gérer les valeurs NULL.
Avec streams introduit dans Java 8 cela peut être fait:
int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();
Cependant, il n'existe actuellement que des flux primitifs pour int
, long
et double
. Si vous devez convertir en un autre type primitif tel que byte
, le moyen le plus court sans bibliothèque externe est le suivant:
byte[] byteArray = new byte[array.length];
for(int i = 0; i < array.length; i++) byteArray[i] = array[i];
Ou la boucle for peut être remplacée par un flux si vous le souhaitez:
IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]);
Tous ces éléments lanceront un NullPointerException
si l'un de vos éléments est null
.
Utilisation de Guava :
int[] intArray = Ints.toArray(Arrays.asList(array));
Documentation:
Arrays.asList
(API principale)Ints.toArray
(Goyave)En particulier, cela peut être fait sans avoir à créer un nouveau tableau et à parcourir le contenu.
Vous ne pouvez pas convertir un tableau d'Integer en int (c'est-à-dire que vous ne pouvez pas changer le type des éléments d'un tableau) en Java. Vous devez donc soit créer un nouveau tableau int [] et y copier la valeur des objets Integer, soit utiliser un adaptateur:
class IntAdapter {
private Integer[] array;
public IntAdapter (Integer[] array) { this.array = array; }
public int get (int index) { return array[index].intValue(); }
}
Cela peut rendre votre code un peu plus lisible et l'objet IntAdapter ne consommera que quelques octets de mémoire. Le gros avantage d'un adaptateur est que vous pouvez gérer des cas spéciaux ici:
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();
}
}
Une autre solution consiste à utiliser Commons Primitives qui contient de nombreux adaptateurs prédéfinis. Dans votre cas, jetez un œil à ListIntList .
Ou faites-le simplement si vous ne le faites qu'une seule fois. Mais vous n'avez pas parlé d'Integer! = Null case.
//array is the Integer array
int[] array2 = new int[array.length];
int i=0;
for (Integer integer : array) {
array2[i] = integer.intValue();
i++;
}
utiliser Dollar est aussi simple que:
Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();