Comment convertir un tableau en liste en Java?
J'ai utilisé le Arrays.asList()
mais le comportement (et la signature) est en quelque sorte passé de Java SE 1.4.2 (les documents sont maintenant archivés) à 8 et la plupart des extraits que j'ai trouvés sur le Web utilisent le comportement 1.4.2.
Par exemple:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
- sur 1.4.2 renvoie une liste contenant les éléments 1, 2, 3
- sur 1.5.0+ renvoie une liste contenant le spam du tableau
Dans de nombreux cas, il doit être facile à détecter, mais parfois il peut passer inaperçu:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
java
arrays
list
data-conversion
Alexandru
la source
la source
Arrays.asList(new int[] { 1, 2, 3 })
:; n'a certainement pas compilé en Java 1.4.2, car anint[]
n'est pas unObject[]
.Arrays.asList
devrait fonctionner.Réponses:
Dans votre exemple, c'est parce que vous ne pouvez pas avoir une liste de type primitif. En d'autres termes, ce
List<int>
n'est pas possible.Vous pouvez cependant avoir une
List<Integer>
utilisation de laInteger
classe qui encapsule laint
primitive. Convertissez votre tableau en unList
avec laArrays.asList
méthode utilitaire.Découvrez ce code en direct sur IdeOne.com .
la source
List<Integer[]>
?Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
Dans Java 8, vous pouvez utiliser des flux:
la source
boolean[]
. Je suppose que c'est parce qu'il est tout aussi facile de faire unBoolean[]
. C'est probablement une meilleure solution. Quoi qu'il en soit, c'est une bizarrerie intéressante.En parlant de conversion, cela dépend de la raison pour laquelle vous en avez besoin
List
. Si vous en avez besoin juste pour lire les données. OK, c'est parti:Mais si vous faites quelque chose comme ça:
vous obtenez
java.lang.UnsupportedOperationException
. Donc, dans certains cas, vous en avez même besoin:La première approche ne convertit pas réellement le tableau mais le «représente» comme un
List
. Mais le tableau est sous le capot avec toutes ses propriétés comme un nombre fixe d'éléments. Veuillez noter que vous devez spécifier le type lors de la constructionArrayList
.la source
Le problème est que varargs a été introduit dans Java5 et malheureusement,
Arrays.asList()
surchargé avec une version vararg aussi. AinsiArrays.asList(spam)
est compris par le compilateur Java5 comme un paramètre vararg des tableaux int.Ce problème est expliqué plus en détail dans Effective Java 2nd Ed., Chapter 7, Item 42.
la source
Il semble peu tard mais voici mes deux cents. Nous ne pouvons pas avoir
List<int>
commeint
un type primitif, nous ne pouvons donc que l'avoirList<Integer>
.Java 8 (tableau int)
Java 8 et versions antérieures (tableau entier)
Besoin d'ArrayList et non de List?
Dans le cas où nous voulons une implémentation spécifique,
List
par exemple,ArrayList
nous pouvons utilisertoCollection
comme:Pourquoi
list21
ne peut - on pas être modifié structurellement?Lorsque nous utilisons
Arrays.asList
la taille de la liste retournée est fixe car la liste retournée ne l'est pasjava.util.ArrayList
, mais une classe statique privée définie à l'intérieurjava.util.Arrays
. Donc, si nous ajoutons ou supprimons des éléments de la liste retournée, unUnsupportedOperationException
sera levé. Nous devons donc aller aveclist22
quand nous voulons modifier la liste. Si nous avons Java8, nous pouvons également y allerlist23
.Pour être clair, cela
list21
peut être modifié dans le sens que nous pouvons appeler,list21.set(index,element)
mais cette liste peut ne pas être structurellement modifiée, c'est-à-dire qu'elle ne peut pas ajouter ou supprimer des éléments de la liste. Vous pouvez également vérifier cette question .Si nous voulons une liste immuable, nous pouvons l'envelopper comme suit:
Un autre point à noter est que la méthode
Collections.unmodifiableList
retourne une vue non modifiable de la liste spécifiée. Une collection de vues non modifiables est une collection non modifiable et est également une vue sur une collection de supports. Notez que des modifications de la collection de supports peuvent toujours être possibles et si elles se produisent, elles sont visibles à travers la vue non modifiable.Nous pouvons avoir une liste vraiment immuable en Java 9 et 10.
Liste véritablement immuable
Java 9:
Java 10 (liste véritablement immuable) de deux manières:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Consultez également ma réponse pour en savoir plus.
la source
List::add
&List::remove
échoue avec une liste retournée parArrays.asList
. Le JavaDoc pour cette méthode est mal écrit et peu clair sur ce point. À ma troisième lecture, je suppose que l'expression «de taille fixe» voulait dire que l'on ne peut pas ajouter ou supprimer des éléments.Encore plus court:
la source
J'ai récemment dû convertir un tableau en liste. Plus tard, le programme a filtré la liste en essayant de supprimer les données. Lorsque vous utilisez la fonction Arrays.asList (array), vous créez une collection de taille fixe: vous ne pouvez ni ajouter ni supprimer. Cette entrée explique le problème mieux que moi: pourquoi est-ce que j'obtiens une exception UnsupportedOperationException lorsque j'essaie de supprimer un élément d'une liste?.
Au final, j'ai dû faire une conversion "manuelle":
Je suppose que j'aurais pu ajouter la conversion d'un tableau à une liste en utilisant une opération List.addAll (items).
la source
new ArrayList<ListItem>(Arrays.asList(itemsArray))
serait le mêmeCollections.addAll(items, itemsArray)
plutôt.Utilisation de tableaux
C'est le moyen le plus simple de convertir un tableau en
List
. Cependant, si vous essayez d'ajouter un nouvel élément ou de supprimer un élément existant de la liste, unUnsupportedOperationException
sera levé.Utilisation d'ArrayList ou d'autres implémentations de liste
Vous pouvez utiliser une
for
boucle pour ajouter tous les éléments du tableau dans uneList
implémentation, par exempleArrayList
:Utilisation de l'API Stream dans Java 8
Vous pouvez transformer le tableau en flux, puis collecter le flux à l'aide de différents collecteurs: le collecteur par défaut dans Java 8 utilise
ArrayList
derrière l'écran, mais vous pouvez également imposer votre implémentation préférée.Voir également:
la source
Une autre solution de contournement si vous utilisez apache commons-lang:
Où ArrayUtils.toObject se convertit
int[]
enInteger[]
la source
vous devez lancer dans le tableau
la source
Bon mot:
la source
Dans Java 9, vous avez la solution encore plus élégante d'utiliser des listes immuables via la nouvelle méthode de fabrique de commodité
List.of
:(copié sans vergogne d' ici )
la source
Si vous ciblez Java 8 (ou version ultérieure), vous pouvez essayer ceci:
REMARQUE:
Faites attention à la
Collectors.<Integer>toList()
, cette méthode générique vous aide à éviter l'erreur "Non-correspondance de type: impossible de convertir deList<Object>
àList<Integer>
".la source
Utilisation de la goyave:
Utilisation des collections Apache Commons:
la source
Si cela aide: J'ai eu le même problème et j'ai simplement écrit une fonction générique qui prend un tableau et retourne une ArrayList du même type avec le même contenu:
la source
Étant donné le tableau:
Conversion d'un tableau d'entiers en liste d'entiers
One way: boxed () -> retourne l'IntStream
Deuxième façon: mappez chaque élément du flux en entier, puis collectez
REMARQUE: En utilisant mapToObj, vous pouvez convertir chaque élément int en flux de chaînes, flux de caractères, etc. en mettant i dans (char) i
Conversion d'un type de tableau en un autre type Exemple:
la source
Cela dépend donc de la version Java que vous essayez-
Java 7
OU
OU
Dans Java 8
Référence - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
la source
Pouvez-vous améliorer cette réponse s'il vous plaît car c'est ce que j'utilise mais je ne suis pas clair à 100%. Cela fonctionne bien mais intelliJ a ajouté une nouvelle WeatherStation [0]. Pourquoi le 0?
la source
utilisez deux lignes de code pour convertir le tableau en liste si vous l'utilisez en valeur entière, vous devez utiliser le type de zone automatique pour le type de données primitif
la source