web-dev-qa-db-fra.com

Conversion d'un tableau d'objets en un tableau de leurs types primitifs

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!

76
Il-Bhima

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?).

39
Zach Scrivena

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.

88
Guillaume

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.

61
Alex

Utilisation de Guava :

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

Documentation:

24
Paul Bellora

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 .

3
Aaron Digulla

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++;
    }
2
Jens Jansson

utiliser Dollar est aussi simple que:

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