142 votes

Convertir un tableau de longs primitifs en une liste de longs

C'est peut-être une question un peu facile, mais ma première tentative a étonnamment échoué. Je voulais prendre un tableau de longs primitifs et le transformer en une liste, ce que j'ai essayé de faire comme ceci :

long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!

Quelle est la bonne façon de procéder ?

6 votes

Je pense que nous avons eu la même question pour les ints, n'est-ce pas ?

3 votes

121voto

marcin_j Points 12237

Depuis Java 8, vous pouvez maintenant utiliser des flux pour cela :

long[] arr = { 1, 2, 3, 4 };
List<Long> list = Arrays.stream(arr).boxed().collect(Collectors.toList());

8 votes

Bien joué ! Malheureusement, et de façon quelque peu mystérieuse, le stream est uniquement définie pour int[] , long[] y double[] .

1 votes

Alternativement, vous pouvez utiliser LongStream.of(arr).boxed()... .

2 votes

Arrays.stream(arr).boxed().collect(Collectors.toList()); Malheureusement, cela ne peut renvoyer que List<Object>

116voto

Eran Medan Points 12234

J'ai trouvé pratique de le faire en utilisant apache commons lang ArrayUtils ( JavaDoc , Dépendance Maven )

import org.apache.commons.lang3.ArrayUtils;
...
long[] input = someAPI.getSomeLongs();
Long[] inputBoxed = ArrayUtils.toObject(input);
List<Long> inputAsList = Arrays.asList(inputBoxed);

il dispose également de l'API inverse

long[] backToPrimitive = ArrayUtils.toPrimitive(objectArray);

EDITAR: mis à jour pour fournir une conversion complète en liste comme suggéré par les commentaires et autres corrections.

4 votes

Considérant que cela crée un tableau de Longs, pas une liste il ne répond pas à la question de l'OP et obtient mon downvote. Comment diable cela a-t-il obtenu 56 votes positifs et le "check" tant convoité ???

7 votes

Parce que les gens peuvent facilement faire Arrays.asList(ArrayUtils.toObject(input)) probablement.

1 votes

Je suis d'accord avec @user949300. Cela ne répond pas à la question.

36voto

user356765 Points 321
import java.util.Arrays;
import org.apache.commons.lang.ArrayUtils;

List<Long> longs = Arrays.asList(ArrayUtils.toObject(new long[] {1,2,3,4}));

8 votes

Une explication de ce qu'il fait et s'il s'agit d'une bibliothèque tierce serait utile.

35voto

erickson Points 127945

hallidave y jpalecek ont la bonne idée - itérer sur un tableau - mais ils ne tirent pas avantage d'une fonctionnalité fournie par ArrayList car la taille de la liste est connue dans ce cas, vous devez le spécifier lors de la création de l'interface utilisateur. ArrayList .

List<Long> list = new ArrayList<Long>(input.length);
for (long n : input)
  list.add(n);

De cette façon, aucun tableau inutile n'est créé pour être ensuite éliminé par l'utilisateur. ArrayList parce qu'ils s'avèrent être trop courts, et aucun "créneau" vide n'est gaspillé car ArrayList a surestimé ses besoins en espace. Bien entendu, si vous continuez à ajouter des éléments à la liste, un nouveau tableau de sauvegarde sera nécessaire.

1 votes

J'ai tendance à laisser de côté la spécification de la longueur, sauf s'il est prouvé que le code fait partie d'un point sensible en termes de performances ou que le tableau est censé être extrêmement grand. Je pense que le fait de ne pas spécifier la longueur rend le code légèrement plus lisible.

19voto

hallidave Points 3887

Un peu plus verbeux, mais cela fonctionne :

    List<Long> list = new ArrayList<Long>();
    for (long value : input) {
        list.add(value);
    }

Dans votre exemple, il semble que Arrays.asList() interprète l'entrée comme une liste de tableaux de long[] au lieu d'une liste de long. C'est un peu surprenant, c'est sûr. L'auto-boxing ne fonctionne pas comme vous le souhaitez dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X