streams procesamiento print parte examples ejemplo datos con arrays java-8 java-stream

arrays - procesamiento - Java 8 Stream y operación en matrices



stream java methods (4)

Puede convertir una matriz en una secuencia usando Arrays.stream() :

int[] ns = new int[] {1,2,3,4,5}; Arrays.stream(ns);

Una vez que tenga su transmisión, puede usar cualquiera de los métodos descritos en la documentación , como sum() o lo que sea. Puede map o filter como en Python llamando a los métodos de flujo relevantes con una función Lambda:

Arrays.stream(ns).map(n -> n * 2); Arrays.stream(ns).filter(n -> n % 4 == 0);

Una vez que haya terminado de modificar su flujo, llame a toArray() para convertirlo nuevamente en una matriz para usar en otro lugar:

int[] ns = new int[] {1,2,3,4,5}; int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();

Acabo de descubrir las nuevas capacidades de flujo de Java 8. Viniendo de Python, me preguntaba si ahora había una manera ordenada de hacer operaciones en arreglos como la suma, la multiplicación de dos matrices de una manera "una línea pitónica".

Gracias


Tenga cuidado si tiene que lidiar con números grandes.

int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE}; long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0

La suma anterior no es 2 * Integer.MIN_VALUE . Necesitas hacer esto en este caso.

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct


Tenga en cuenta que Arrays.stream (arr) crea un LongStream (o IntStream, ...) en lugar de Stream, por lo que la función del mapa no se puede usar para modificar el tipo. Esta es la razón por la cual se proporcionan las funciones .mapToLong, mapToObject, ....

Eche un vistazo a why-cant-i-map-integers-to-strings-when-streaming-from-an-array


Se agregaron nuevos métodos a java.util.Arrays para convertir una matriz en una secuencia de Java 8 que luego se puede usar para sumar, etc.

int sum = Arrays.stream(myIntArray) .sum();

Multiplicar dos matrices es un poco más difícil porque no se me ocurre una manera de obtener el valor Y el índice al mismo tiempo que una operación de transmisión. Esto significa que probablemente deba transmitir los índices de la matriz.

//in this example a[] and b[] are same length int[] a = ... int[] b = ... int[] result = new int[a.length]; IntStream.range(0, a.length) .forEach(i -> result[i] = a[i] * b[i]);

EDITAR

El comentarista @Holger señala que puede usar el método de map lugar de para forEach como este:

int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();