J'essaie de convertir une ArrayList contenant des objets Integer en primitive int [] avec le morceau de code suivant, mais cela génère une erreur de temps de compilation. Est-il possible de convertir en Java?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
java
arrays
arraylist
primitive-types
Snehal
la source
la source
List<Integer> x = new ArrayList<Integer>();
Integer[] n = x.toArray(new Integer[0]);
Réponses:
Vous pouvez convertir, mais je ne pense pas qu'il y ait quelque chose de intégré pour le faire automatiquement:
(Notez que cela lèvera une NullPointerException si l'un
integers
ou l'autre des éléments qu'il contientnull
.)EDIT: Selon les commentaires, vous voudrez peut-être utiliser l'itérateur de liste pour éviter des coûts désagréables avec des listes telles que
LinkedList
:la source
integers.stream().mapToInt(Integer::valueOf).toArray
Si vous utilisez java-8 il y a aussi une autre façon de procéder.
Ce qu'il fait, c'est:
Stream<Integer>
de la listeIntStream
en mappant chaque élément sur lui-même (fonction d'identité), déballage de laint
valeur détenue par chaqueInteger
objet (fait automatiquement depuis Java 5)int
en appelanttoArray
Vous pouvez également appeler explicitement
intValue
via une référence de méthode, c'est-à-dire:Il convient également de mentionner que vous pouvez en obtenir un
NullPointerException
si vous avez unenull
référence dans la liste. Cela pourrait être facilement évité en ajoutant une condition de filtrage au pipeline de flux comme ceci:Exemple:
la source
double
types; n'y a-t-il pas d'équivalent pour lesfloat
types?Google Guava
Google Guava offre un moyen pratique de le faire en appelant
Ints.toArray
.la source
Apache Commons a une classe ArrayUtils, qui a une méthode toPrimitive () qui fait exactement cela.
Cependant, comme Jon l'a montré, il est assez facile de le faire vous-même au lieu d'utiliser des bibliothèques externes.
la source
Je pense que l'itération à l'aide de l'itérateur de la liste est une meilleure idée, car
list.get(i)
les performances peuvent être médiocres selon la mise en œuvre de la liste:la source
utiliser Dollar devrait être assez simple:
Je prévois d'améliorer la DSL afin de supprimer l'
toArray()
appel intermédiairela source
Cela fonctionne bien pour moi :)
Trouvé sur https://www.techiedelight.com/convert-list-integer-array-int/
la source
Cela m'étonne que nous encourageons les méthodes personnalisées ponctuelles chaque fois qu'une bibliothèque parfaitement bonne et bien utilisée comme Apache Commons a déjà résolu le problème. Bien que la solution soit triviale sinon absurde, il est irresponsable d'encourager un tel comportement en raison de la maintenance et de l'accessibilité à long terme.
Allez avec Apache Commons
la source
Si vous utilisez des collections Eclipse , vous pouvez utiliser la
collectInt()
méthode pour basculer d'un conteneur d'objets vers un conteneur int primitif.Si vous pouvez convertir votre
ArrayList
en unFastList
, vous pouvez vous débarrasser de l'adaptateur.Remarque: je suis un committer pour les collections Eclipse.
la source
Java 8:
la source
Arrays.setAll ()
Production:
Les mêmes œuvres pour un tableau de
long
oudouble
, mais pas pour les tableaux deboolean
,char
,byte
,short
oufloat
. Si vous avez une liste vraiment énorme, il existe même uneparallelSetAll
méthode que vous pouvez utiliser à la place.Pour moi, c'est assez bon et assez élancé pour que je ne veuille pas obtenir une bibliothèque externe ni utiliser de flux pour cela.
Lien de documentation:
Arrays.setAll(int[], IntUnaryOperator)
la source
Vous pouvez simplement le copier dans un tableau:
Pas trop de fantaisie; mais bon ça marche ...
la source
Une solution monoligne très simple est:
la source
Ce segment de code fonctionne pour moi, essayez ceci:
Il convient de mentionner ArrayList devrait être déclaré comme suit:
la source
la source
accès
arr
comme d'habitudeint[]
.la source