Właśnie odkryłem nowe możliwości strumienia Java 8. Pochodząc z Pythona, zastanawiałem się, czy istnieje teraz dobry sposób na wykonywanie operacji na tablicach, takich jak sumowanie, mnożenie dwóch tablic w sposób „pythonowy” w jednej linii?
Dzięki
Właśnie odkryłem nowe możliwości strumienia Java 8. Pochodząc z Pythona, zastanawiałem się, czy istnieje teraz dobry sposób na wykonywanie operacji na tablicach, takich jak sumowanie, mnożenie dwóch tablic w sposób „pythonowy” w jednej linii?
Dzięki
Odpowiedzi:
Dodano nowe metody java.util.Arrayskonwertowania tablicy na strumień Java 8, który można następnie wykorzystać do sumowania itp.
int sum = Arrays.stream(myIntArray)
.sum();
Mnożenie dwóch tablic jest nieco trudniejsze, ponieważ nie mogę wymyślić sposobu na uzyskanie wartości ORAZ indeksu jednocześnie z operacją Stream. Oznacza to, że prawdopodobnie musisz przesyłać strumieniowo przez indeksy tablicy.
//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]);
EDYTOWAĆ
Commenter @Holger wskazuje, można użyć mapmetody zamiast forEachtak:
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
mapToIntaby uniknąć boksu.
Możesz zmienić tablicę w strumień, używając Arrays.stream():
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
Po otrzymaniu strumienia możesz użyć dowolnej z metod opisanych w dokumentacji , takich jak sum()cokolwiek. Można mapalbo filterjak w Pythonie poprzez wywołanie odpowiednich metod strumieniowych z funkcji Lambda:
Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);
Po zakończeniu modyfikowania strumienia wywołujesz go, toArray()aby przekonwertować go z powrotem na tablicę i użyć w innym miejscu:
int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();
Uważaj, jeśli masz do czynienia z dużymi liczbami.
int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0
Powyższa suma nie jest 2 * Integer.MIN_VALUE. W tym przypadku musisz to zrobić.
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
Należy pamiętać, że Arrays.stream (arr) tworzy LongStream (lub IntStream, ...) zamiast Stream, więc nie można użyć funkcji mapy do modyfikacji typu. Właśnie dlatego dostępne są funkcje .mapToLong, mapToObject, ...
Zobacz dlaczego-cant-i-map-integers-to-strings-when-streaming-from-an-array
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();