Wie konvertiere ich einen Java 8 IntStream in eine Liste?

283

Ich schaue in den Dokumenten nach IntStreamund sehe eine toArrayMethode, aber keine Möglichkeit, direkt zu einer zu gelangenList<Integer>

Sicher gibt es eine Möglichkeit, a Streamin a umzuwandeln List?

Eric Wilson
quelle
Versuchen Sie diesen Link: stackoverflow.com/questions/14830313/…
Vaibhav Jain
2
@KarlRichter Die andere Frage gibt Ihnen keine getippte Liste. Auch diese Frage war von vor vier Jahren und hat eine Antwort mit mehr als 300 Upvotes. Warum versuchen wir es jetzt zusammenzuführen?
Eric Wilson

Antworten:

541

IntStream::boxed

IntStream::boxedverwandelt ein IntStreamin ein Stream<Integer>, das Sie dann collectin ein List:

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

Die boxedMethode konvertiert die intprimitiven Werte von IntStreamin in einen Objektstrom Integer. Das Wort "Boxen" bezeichnet den int⬌- IntegerKonvertierungsprozess. Siehe Oracle Tutorial .

Ian Roberts
quelle
1
@skiwi Ich meine, dass alle anderen Antworten nach dieser nicht mehr benötigt werden, da sie nicht so natürlich wären.
Dmitry Ginzburg
1
Danke, ich hatte die Boxmethode noch nicht gesehen und sie funktionierte wie ein Zauber.
Twreid
Ergänzung: Ich denke, dieser Code wird etwas kürzer, klarer und hübscher, wenn Sie einen statischen Import von verwenden toList. Dazu setzen Sie Folgendes unter die Importe der Datei : static import java.util.stream.Collectors.toList;. Dann liest der Sammelruf gerade .collect(toList()).
Lii
1
In Eclipse kann die IDE einen statischen Import für Methoden hinzufügen. Dazu fügen Sie die CollectorsKlasse unter Einstellungen -> Java -> Editor -> Inhaltsassistent -> Favoriten hinzu . Danach müssen Sie nur noch toLibei gedrückter Strg + Leertaste eingeben , damit die IDE ausgefüllt toListund der statische Import hinzugefügt wird.
Lii
2
Ich habe mir die Haare herausgerissen, was mit dem, was ich versucht hatte, nicht stimmte. Danke, dass Sie auf den boxed()Teil hingewiesen haben
K Raphael
16

Sie können auch mapToObj () für einen Stream verwenden, der eine IntFunction verwendet und einen Stream mit Objektwert zurückgibt, der aus den Ergebnissen der Anwendung der angegebenen Funktion auf die Elemente dieses Streams besteht.

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
Ida Bucić
quelle
4
In einem ironischen Schlag boxed()delegiert dies an.
Makoto
9

Sie können primitive Sammlungen verwenden, die in Eclipse- Sammlungen verfügbar sind, und das Boxen vermeiden.

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

Hinweis: Ich bin ein Mitarbeiter von Eclipse Collections.

Nikhil Nanivadekar
quelle
6
Obwohl Eclipse-Sammlungen normalerweise sehr hilfreich sind, sieht es nicht so aus, als würde es irgendetwas einfacher machen :)
Ben
1
Seit EC 9.0 können Sie eine primitive Liste aus einem primitiven Stream erstellen. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab
1
Dies ist, wonach ich gesucht habe. Das Boxen des int-Streams in Integer oder in Object ist etwas anderes
Vikash
2

Finden Sie das folgende Beispiel zum Finden des Quadrats jedes int-Elements mit 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);
Vikash
quelle
0

Sie können die Erfassungsmethode verwenden:

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

Tatsächlich ist dies fast genau das, was Java tut, wenn Sie .collect (Collectors.toList ()) für einen Objektstrom aufrufen:

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);
}

Hinweis: Der dritte Parameter ist nur erforderlich, wenn Sie die parallele Erfassung ausführen möchten. Für die sequentielle Sammlung reichen nur die ersten beiden aus.

Harry Jones
quelle