Java 8 Stream y operación en matrices

Resuelto BlackLabrador asked hace 10 años • 4 respuestas

Acabo de descubrir las nuevas capacidades de transmisión de Java 8. Viniendo de Python, me preguntaba si ahora había una manera clara de realizar operaciones en matrices como sumar y multiplicar dos matrices en una forma "pitónica de una línea".

Gracias

BlackLabrador avatar Jun 24 '14 22:06 BlackLabrador
Aceptado

Se agregan nuevos métodos para java.util.Arraysconvertir 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 como una operación Stream. Esto significa que probablemente tengas que transmitir sobre 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]);

El comentarista @Holger señala que puedes usar el mapmétodo en lugar de forEacheste:

int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
dkatzel avatar Jun 24 '2014 15:06 dkatzel

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

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

Una vez que tengas tu transmisión, puedes usar cualquiera de los métodos descritos en la documentación , como sum()o lo que sea. Puedes mapo filterte gusta 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 transmisión, llame toArray()para convertirla nuevamente en una matriz para usarla 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();
Ian Knight avatar Jun 24 '2014 16:06 Ian Knight

Tenga cuidado si tiene que lidiar con grandes cantidades.

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

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

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
Sanghyun Lee avatar May 21 '2016 08:05 Sanghyun Lee

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

Eche un vistazo a por qué no puedo asignar enteros a cadenas cuando se transmite desde una matriz

Rafael avatar Oct 30 '2017 08:10 Rafael