Jak przekonwertować IntStream Java 8 na listę?

283

Patrzę na dokumenty dla IntStreami widzę toArraymetodę, ale nie ma sposobu, aby przejść bezpośrednio doList<Integer>

Z pewnością istnieje sposób na konwersję A Streamna List?

Eric Wilson
źródło
Spróbuj tego linku: stackoverflow.com/questions/14830313/...
Vaibhav Jain
2
@KarlRichter Drugie pytanie nie daje ci wpisanej listy. To pytanie było także cztery lata temu i ma ponad 300 pozytywnych opinii. Dlaczego próbujemy to teraz połączyć?
Eric Wilson,

Odpowiedzi:

541

IntStream::boxed

IntStream::boxedzamienia an IntStreamw Stream<Integer>, a następnie collectw List:

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

Ta boxedmetoda przekształca intprymitywne wartości IntStreamw strumień Integerobiektów. Słowo „boks” nazywa proces konwersji intInteger. Zobacz samouczek Oracle .

Ian Roberts
źródło
1
@skiwi Mam na myśli, że wszystkie pozostałe odpowiedzi są niepotrzebne, ponieważ nie byłyby tak naturalne.
Dmitry Ginzburg
1
Dziękuję, nie widziałem jeszcze metody pudełkowej i działała jak urok.
twreid
Dodanie: Myślę, że ten kod staje się trochę krótszy, wyraźniejszy i ładniejszy, jeśli używasz importu statycznego 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()).
Lii
1
W środowisku Eclipse możliwe jest, aby IDE dodało statyczny import metod. Odbywa się to poprzez dodanie Collectorsklasy w Preferencjach -> Java -> Edytor -> Content Assist -> Ulubione . Następnie wystarczy wpisać toLiw Ctr + Spacja, aby wypełnić IDE toListi dodać import statyczny.
Lii
2
Odrywałem włosy od tego, co było nie tak z tym, czego próbowałem, dziękuję za zwrócenie uwagi na tę boxed()część
K Raphael,
16

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());
Ida Bucić
źródło
4
W uderzeniu ironii to właśnie boxed()deleguje.
Makoto,
9

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.

Nikhil Nanivadekar
źródło
6
Chociaż kolekcje Eclipse są zwykle bardzo pomocne, nie wygląda na to, że w ogóle coś to ułatwia :)
Ben
1
Od wersji EC 9.0 można budować prymitywną listę z prymitywnego strumienia. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab
1
Właśnie tego szukałem ... boksowanie strumienia int do Integer lub obiekt to inna sprawa
Vikash
2

Znajdź następujący przykład znajdowania kwadratu każdego elementu int za pomocą 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
źródło
0

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.

Harry Jones
źródło