¿Cómo convierto un IntStream de Java 8 en una lista?

Resuelto Eric Wilson asked hace 10 años • 5 respuestas

Estoy mirando los documentos IntStreamy veo un toArraymétodo, pero no hay forma de ir directamente a unList<Integer>

¿ Seguramente hay una manera de convertir a Streamen a List?

Eric Wilson avatar May 15 '14 16:05 Eric Wilson
Aceptado

IntStream::boxed

IntStream::boxedconvierte an IntStreamen a Stream<Integer>, que luego puedes collectconvertir en a List:

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

El boxedmétodo convierte los intvalores primitivos de an IntStreamen una secuencia de Integerobjetos. La palabra "boxeo" nombra el intproceso Integerde conversión. Consulte el tutorial de Oracle .

Java 16 y posterior

Java 16 trajo el toListmétodo más corto. Produce una lista no modificable . Discutido aquí .

theIntStream.boxed().toList() 
Ian Roberts avatar May 15 '2014 09:05 Ian Roberts

También puedes usar mapToObj() en un Stream, que toma una IntFunction y devuelve un Stream valorado por objeto que consta de los resultados de aplicar la función dada a los elementos de este flujo.

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
Ida Bucić avatar Oct 13 '2016 08:10 Ida Bucić

Puede utilizar colecciones primitivas disponibles en las colecciones de Eclipse y evitar el boxeo.

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

Nota: Soy colaborador de Eclipse Collections.

Nikhil Nanivadekar avatar Mar 27 '2016 00:03 Nikhil Nanivadekar

Puedes utilizar el método de recopilación:

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

De hecho, esto es casi exactamente lo que hace Java cuando llamas a .collect(Collectors.toList()) en una secuencia de objetos:

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: El tercer parámetro sólo es necesario si desea ejecutar una recopilación paralela; para la recopilación secuencial, bastará con proporcionar solo los dos primeros.

Harry Jones avatar Jan 20 '2020 13:01 Harry Jones

Encuentre el siguiente ejemplo de cómo encontrar el cuadrado de cada 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);
Vikash avatar Apr 11 '2019 08:04 Vikash