¿Cómo convierto un IntStream de Java 8 en una lista?
Estoy mirando los documentos IntStream
y veo un toArray
método, pero no hay forma de ir directamente a unList<Integer>
¿ Seguramente hay una manera de convertir a Stream
en a List
?
IntStream::boxed
IntStream::boxed
convierte an IntStream
en a Stream<Integer>
, que luego puedes collect
convertir en a List
:
theIntStream.boxed().collect(Collectors.toList())
El boxed
método convierte los int
valores primitivos de an IntStream
en una secuencia de Integer
objetos. La palabra "boxeo" nombra el int
proceso Integer
de conversión. Consulte el tutorial de Oracle .
Java 16 y posterior
Java 16 trajo el toList
método más corto. Produce una lista no modificable . Discutido aquí .
theIntStream.boxed().toList()
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());
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.
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.
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);