Patrzę na dokumenty dla IntStream
i widzę toArray
metodę, ale nie ma sposobu, aby przejść bezpośrednio doList<Integer>
Z pewnością istnieje sposób na konwersję A Stream
na List
?
Patrzę na dokumenty dla IntStream
i widzę toArray
metodę, ale nie ma sposobu, aby przejść bezpośrednio doList<Integer>
Z pewnością istnieje sposób na konwersję A Stream
na List
?
Odpowiedzi:
IntStream::boxed
IntStream::boxed
zamienia an IntStream
w Stream<Integer>
, a następnie collect
w List
:
theIntStream.boxed().collect(Collectors.toList())
Ta boxed
metoda przekształca int
prymitywne wartości IntStream
w strumień Integer
obiektów. Słowo „boks” nazywa proces konwersji int
⬌ Integer
. Zobacz samouczek Oracle .
toList
. Odbywa się to poprzez umieszczenie następujących wśród importu pliku: static import java.util.stream.Collectors.toList;
. Następnie połączenie odbiera tylko .collect(toList())
.
Collectors
klasy w Preferencjach -> Java -> Edytor -> Content Assist -> Ulubione . Następnie wystarczy wpisać toLi
w Ctr + Spacja, aby wypełnić IDE toList
i dodać import statyczny.
boxed()
część
Możesz także użyć mapToObj () w strumieniu, który pobiera IntFunkcję i zwraca obiektowy strumień składający się z wyników zastosowania danej funkcji do elementów tego strumienia.
List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
boxed()
deleguje.
Możesz używać prymitywnych kolekcji dostępnych w Eclipse Collections i unikać boksu.
MutableIntList list =
IntStream.range(1, 5)
.collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);
Uwaga: Jestem współtwórcą kolekcji Eclipse.
MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Możesz użyć metody zbierania:
IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);
W rzeczywistości jest to prawie dokładnie to, co robi Java, gdy wywołujesz .collect (Collectors.toList ()) w strumieniu obiektów:
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);
}
Uwaga: Trzeci parametr jest wymagany tylko wtedy, gdy chcesz uruchomić równoległą kolekcję; do zbierania sekwencyjnego wystarczy podać tylko dwa pierwsze.