Comment convertir un IntStream Java 8 en liste?


283

Je regarde les documents pour le IntStream, et je vois une toArrayméthode, mais aucun moyen d'aller directement à unList<Integer>

Il y a sûrement un moyen de convertir un Streamen un List?



2
@KarlRichter L'autre question ne vous donne pas de liste dactylographiée. En outre, cette question date d'il y a quatre ans et a une réponse avec plus de 300 votes positifs. Pourquoi essayons-nous de le fusionner maintenant?
Eric Wilson

Réponses:


541

IntStream::boxed

IntStream::boxedtransforme un IntStreamen un Stream<Integer>, que vous pouvez ensuite collecttransformer en List:

theIntStream.boxed().collect(Collectors.toList())

La boxedméthode convertit les intvaleurs primitives d'un IntStreamen un flux d' Integerobjets. Le mot "boxe" nomme le processus de conversion intInteger. Voir Oracle Tutorial .


1
@skiwi Je veux dire, que toutes les autres réponses sont inutiles après celle-ci car elles ne seraient pas si naturelles.
Dmitry Ginzburg

1
Merci, je n'avais pas encore vu la méthode en boîte et cela a fonctionné comme un charme.
twreid

Addition: Je pense que ce code devient un peu plus court, plus clair et plus joli si vous utilisez une importation statique de toList. Cela se fait en plaçant les éléments suivants parmi les importations du fichier: static import java.util.stream.Collectors.toList;. Ensuite, l'appel de collecte lit juste .collect(toList()).
Lii

1
Dans Eclipse, il est possible de faire en sorte que l'EDI ajoute une importation statique pour les méthodes. Pour ce faire, ajoutez la Collectorsclasse dans Préférences -> Java -> Éditeur -> Assistant de contenu -> Favoris . Après cela, il vous suffit de taper toLiau hit Ctr + Space pour que l'IDE remplisse toListet ajoute l'importation statique.
Lii

2
Je me suis arraché les cheveux pour savoir ce qui n'allait pas avec ce que j'avais essayé, merci d'avoir souligné la boxed()partie
K Raphael

16

Vous pouvez également utiliser mapToObj () sur un Stream, qui prend une IntFunction et retourne un Stream à valeur objet composé des résultats de l'application de la fonction donnée aux éléments de ce flux.

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());

4
Dans un coup d'ironie, c'est à cela que l' boxed()on délègue.
Makoto

9

Vous pouvez utiliser les collections primitives disponibles dans les collections Eclipse et éviter la boxe.

MutableIntList list = 
    IntStream.range(1, 5)
    .collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);

Remarque: je suis un contributeur aux collections Eclipse.


6
Bien que les collections Eclipse soient généralement très utiles, cela ne semble pas du tout faciliter les choses :)
Ben

1
Depuis EC 9.0, vous pouvez créer une liste primitive à partir d'un flux primitif. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab

1
C'est ce que je cherchais .. boxer le flux int vers Integer ou pour objecter est une chose différente
Vikash

2

Trouvez l'exemple suivant pour trouver le carré de chaque élément int à l'aide de Java 8: -

IntStream ints = Arrays.stream(new int[] {1,2,3,4,5});       
List<Integer> intsList = ints.map(x-> x*x)
          .collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);

0

Vous pouvez utiliser la méthode de collecte:

IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);

En fait, c'est presque exactement ce que fait Java lorsque vous appelez .collect (Collectors.toList ()) sur un flux d'objets:

public static <T> Collector<T, ?, List<T>> toList() {
    return new Collectors.CollectorImpl(ArrayList::new, List::add, (var0, var1) -> {
        var0.addAll(var1);
        return var0;
    }, CH_ID);
}

Remarque: Le troisième paramètre n'est requis que si vous souhaitez exécuter une collecte parallèle; pour la collecte séquentielle, fournir uniquement les deux premiers suffira.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.