Java 8 Stream y operación en matrices
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
Se agregan nuevos métodos para java.util.Arrays
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 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 map
método en lugar de forEach
este:
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
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 map
o filter
te 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();
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
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