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


283

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

¿Seguramente hay una manera de convertir Streama a List?



2
@KarlRichter La otra pregunta no te da una lista escrita. Además, esta pregunta era de hace cuatro años y tiene una respuesta con más de 300 votos a favor. ¿Por qué estamos tratando de fusionarlo ahora?
Eric Wilson

Respuestas:


541

IntStream::boxed

IntStream::boxedconvierte un IntStreama Stream<Integer>, que luego puedes collectconvertir en un List:

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

El boxedmétodo convierte los intvalores primitivos de an IntStreamen un flujo de Integerobjetos. La palabra "boxeo" nombra el proceso de conversión intInteger. Vea el tutorial de Oracle .


1
@skiwi quiero decir, que todas las otras respuestas son innecesarias después de esta, ya que no serían tan naturales.
Dmitry Ginzburg

1
Gracias, todavía no había visto el método en caja y funcionó de maravilla.
twreid

Adición: creo que este código se vuelve un poco más corto, más claro y más bonito si usa una importación estática de toList. Esto se realiza mediante la colocación de la siguiente entre las importaciones del archivo: static import java.util.stream.Collectors.toList;. Entonces la llamada por cobrar se lee solo .collect(toList()).
Lii

1
En Eclipse es posible hacer que el IDE agregue una importación estática para los métodos. Esto se hace agregando la Collectorsclase en Preferencias -> Java -> Editor -> Content Assist -> Favoritos . Después de esto, solo tiene que escribir toLial presionar Ctr + Espacio para que el IDE se complete toListy agregue la importación estática.
Lii

2
Me estaba arrancando el pelo sobre lo que estaba mal con lo que había intentado, gracias por señalar el boxed()papel
K Raphael

16

También puede usar mapToObj () en una secuencia, que toma una IntFunción y devuelve una secuencia con valor de objeto que consiste en los resultados de aplicar la función dada a los elementos de esta secuencia.

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

44
En un golpe de ironía, esto es a lo que boxed()se delega.
Makoto

9

Puede usar colecciones primitivas disponibles en Eclipse Collections y evitar el boxeo.

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

Nota: Soy colaborador de Eclipse Collections.


66
Aunque las colecciones de Eclipse suelen ser bastante útiles, no parece que esté haciendo nada más fácil :)
Ben

1
Desde EC 9.0, puede crear una lista primitiva a partir de un flujo primitivo. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab el

1
Esto es lo que estaba buscando ... encajonar la secuencia int a Integer u objetar es algo diferente
Vikash

2

Encuentre el siguiente ejemplo de 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);

0

Puedes usar el método de recolección:

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

De hecho, esto es casi exactamente lo que hace Java cuando llama 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 solo es necesario si desea ejecutar la recopilación paralela; para una colección secuencial, bastará con los dos primeros.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.