404 Stimmen

Wie konvertiere ich ein Java 8 IntStream in eine Liste?

Ich schaue mir die Dokumentation für den IntStream an, und ich sehe eine toArray Methode, aber keinen direkten Weg zu einer List

Sicher gibt es einen Weg, einen Stream in eine List umzuwandeln?

747voto

Ian Roberts Punkte 117705

IntStream::boxed

[IntStream::boxed](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/IntStream.html#boxed()) wandelt einen IntStream in einen Stream um, den Sie dann sammeln können in eine Liste:

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

Die Methode boxed konvertiert die primitiven Werte vom Typ int eines IntStreams in einen Stream von Integer-Objekten. Das Wort "boxing" bezeichnet den Umwandlungsprozess von int in Integer. Siehe Oracle Tutorial.

Java 16 und später

Java 16 brachte die kürzere Methode [toList](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/stream/Stream.html#toList()). Erzeugt eine unveränderliche Liste. Diskutiert hier.

theIntStream.boxed().toList()

25voto

Ida Bucić Punkte 909

Sie könnten auch mapToObj() auf einem Stream verwenden, der eine IntFunction verwendet und einen objektwertigen Stream zurückgibt, der aus den Ergebnissen besteht, die durch Anwendung der gegebenen Funktion auf die Elemente dieses Streams entstehen.

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

9voto

Nikhil Nanivadekar Punkte 1132

Sie können die primitiven Sammlungen verwenden, die in Eclipse Collections verfügbar sind, und das Boxing vermeiden.

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

Hinweis: Ich bin ein Beitragender zu Eclipse Collections.

8voto

Harry Jones Punkte 327

Sie können die collect-Methode 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()) auf einem Objektstrom aufrufen:

public static  Collector> 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 eine parallele Sammlung möchten; für sequentielle Sammlung reichen die ersten beiden aus.

3voto

Vikash Punkte 1977

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 intsList = ints.map(x-> x*x)
          .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X