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?
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?
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 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()
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());
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.
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.
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.