Ho appena scoperto le nuove funzionalità del flusso Java 8. Provenendo da Python, mi chiedevo se ora ci fosse un modo pulito per eseguire operazioni su array come il summing, moltiplicando due array in modo "una linea pitonica"?
Grazie
Ho appena scoperto le nuove funzionalità del flusso Java 8. Provenendo da Python, mi chiedevo se ora ci fosse un modo pulito per eseguire operazioni su array come il summing, moltiplicando due array in modo "una linea pitonica"?
Grazie
Risposte:
Sono stati aggiunti nuovi metodi java.util.Arrays
per convertire un array in un flusso Java 8 che può quindi essere utilizzato per la somma ecc.
int sum = Arrays.stream(myIntArray)
.sum();
Moltiplicare due matrici è un po 'più difficile perché non riesco a pensare a un modo per ottenere il valore E l'indice contemporaneamente a un'operazione Stream. Ciò significa che probabilmente dovrai eseguire lo streaming sopra gli indici dell'array.
//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]);
MODIFICARE
Commenter @Holger sottolinea che è possibile utilizzare il map
metodo anziché in forEach
questo modo:
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
mapToInt
per evitare la boxe.
Puoi trasformare un array in un flusso usando Arrays.stream()
:
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
Una volta ottenuto il tuo stream, puoi utilizzare uno qualsiasi dei metodi descritti nella documentazione , come sum()
o altro. È possibile map
o filter
gradire in Python chiamando i metodi di streaming pertinenti con una funzione Lambda:
Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);
Una volta terminata la modifica del flusso, si chiama quindi toArray()
per riconvertirlo in un array da utilizzare altrove:
int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();
Fai attenzione se hai a che fare con numeri grandi.
int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0
La somma sopra non lo è 2 * Integer.MIN_VALUE
. Devi farlo in questo caso.
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
Si noti che Arrays.stream (arr) crea un LongStream (o IntStream, ...) invece di Stream, quindi la funzione map non può essere utilizzata per modificare il tipo. Ecco perché sono fornite le funzioni .mapToLong, mapToObject, ...
Dai un'occhiata a perché-non-posso-mappare-numeri-interi-stringhe-quando-streaming-da-un-array
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();