Acabei de descobrir os novos recursos de fluxo do Java 8. Vindo de Python, eu queria saber se havia agora uma maneira elegante de fazer operações em matrizes como soma, multiplicando duas matrizes de uma maneira "uma linha pitônica"?
obrigado
Acabei de descobrir os novos recursos de fluxo do Java 8. Vindo de Python, eu queria saber se havia agora uma maneira elegante de fazer operações em matrizes como soma, multiplicando duas matrizes de uma maneira "uma linha pitônica"?
obrigado
Respostas:
Foram adicionados novos métodos java.util.Arrayspara converter uma matriz em um fluxo Java 8 que pode ser usado para somar, etc.
int sum = Arrays.stream(myIntArray)
.sum();
Multiplicar duas matrizes é um pouco mais difícil, porque não consigo pensar em uma maneira de obter o valor E o índice ao mesmo tempo que uma operação de Stream. Isso significa que você provavelmente precisará transmitir sobre os índices da 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
O Commenter @Holger indica que você pode usar o mapmétodo em vez de forEach:
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
mapToIntpara evitar o boxe.
Você pode transformar uma matriz em um fluxo usando Arrays.stream():
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
Depois de obter seu fluxo, você pode usar qualquer um dos métodos descritos na documentação , como sum()ou o que quer. Você pode gostar mapou filtergostar do Python chamando os métodos de fluxo relevantes com uma função Lambda:
Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);
Depois de modificar o seu fluxo, chame-o toArray()para convertê-lo novamente em uma matriz para usar em outro 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();
Tenha cuidado se você tiver que lidar com grandes números.
int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0
A soma acima não é 2 * Integer.MIN_VALUE. Você precisa fazer isso neste caso.
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
Observe que Arrays.stream (arr) cria um LongStream (ou IntStream, ...) em vez de Stream, para que a função de mapa não possa ser usada para modificar o tipo. É por isso que as funções .mapToLong, mapToObject, ... são fornecidas.
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();