Je regarde les documents pour le IntStream
, et je vois une toArray
méthode, mais aucun moyen d'aller directement à unList<Integer>
Il y a sûrement un moyen de convertir un Stream
en un List
?
Je regarde les documents pour le IntStream
, et je vois une toArray
méthode, mais aucun moyen d'aller directement à unList<Integer>
Il y a sûrement un moyen de convertir un Stream
en un List
?
Réponses:
IntStream::boxed
IntStream::boxed
transforme un IntStream
en un Stream<Integer>
, que vous pouvez ensuite collect
transformer en List
:
theIntStream.boxed().collect(Collectors.toList())
La boxed
méthode convertit les int
valeurs primitives d'un IntStream
en un flux d' Integer
objets. Le mot "boxe" nomme le processus de conversion int
⬌ Integer
. Voir Oracle Tutorial .
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())
.
Collectors
classe dans Préférences -> Java -> Éditeur -> Assistant de contenu -> Favoris . Après cela, il vous suffit de taper toLi
au hit Ctr + Space pour que l'IDE remplisse toList
et ajoute l'importation statique.
boxed()
partie
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());
boxed()
on délègue.
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.
MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
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.