Come posso convertire un Java 8 IntStream in un elenco?


283

Sto guardando i documenti per il IntStream, e vedo un toArraymetodo, ma non c'è modo di andare direttamente a unList<Integer>

Sicuramente c'è un modo per convertire un Streamin un List?



2
@KarlRichter L'altra domanda non ti dà un elenco tipizzato. Inoltre, questa domanda era di quattro anni fa e ha una risposta con oltre 300 voti. Perché stiamo provando a unirlo adesso?
Eric Wilson,

Risposte:


541

IntStream::boxed

IntStream::boxedtrasforma a IntStreamin a Stream<Integer>, che puoi quindi collectin a List:

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

Il boxedmetodo converte i intvalori primitivi di an IntStreamin un flusso di Integeroggetti. La parola "boxe" indica il processo di conversione intInteger. Vedi Tutorial Oracle .


1
@skiwi Voglio dire, tutte le altre risposte non sono necessarie dopo questa in quanto non sarebbero così naturali.
Dmitry Ginzburg,

1
Grazie non avevo ancora visto il metodo in scatola e ha funzionato come un fascino.
twreid

Aggiunta: penso che questo codice diventi un po 'più breve, più chiaro e più bello se usi un'importazione statica di toList. Questo viene fatto inserendo il seguente tra le importazioni del file: static import java.util.stream.Collectors.toList;. Quindi la chiamata di raccolta legge solo .collect(toList()).
Lii,

1
In Eclipse è possibile fare in modo che l'IDE aggiunga un'importazione statica per i metodi. Questo viene fatto aggiungendo la Collectorsclasse in Preferenze -> Java -> Editor -> Content Assist -> Preferiti . Dopo questo, devi solo digitare toLia colpo Ctr + Spazio per avere il riempimento IDE toListe aggiungere l'importazione statica.
Lii,

2
Mi stavo strappando i capelli per quello che non andava in quello che avevo provato, grazie per aver sottolineato la boxed()parte
K Raphael,

16

È inoltre possibile utilizzare mapToObj () su uno Stream, che accetta IntFunction e restituisce uno Stream a valore oggetto costituito dai risultati dell'applicazione della funzione data agli elementi di questo stream.

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

4
In un colpo di ironia, questo è ciò che boxed()sta delegando.
Makoto,

9

È possibile utilizzare raccolte primitive disponibili nelle raccolte Eclipse ed evitare il pugilato.

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

Nota: sono un collaboratore delle raccolte Eclipse.


6
Sebbene le raccolte Eclipse siano di solito abbastanza utili, questo non sembra che stia rendendo nulla di più semplice :)
Ben

1
Da EC 9.0, è possibile creare un elenco di primitive da uno stream primitivo. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab,

1
Questo è quello che stavo cercando ... inscatolare il flusso int su Integer o obiettare è una cosa diversa
Vikash

2

Trova l'esempio seguente di trovare il quadrato di ogni elemento int usando 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);

0

È possibile utilizzare il metodo di raccolta:

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

In effetti, questo è quasi esattamente ciò che Java sta facendo quando si chiama .collect (Collectors.toList ()) su un flusso di oggetti:

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

Nota: il terzo parametro è richiesto solo se si desidera eseguire la raccolta parallela; per la raccolta sequenziale sono sufficienti solo i primi due.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.