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?
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 lengthint[] a =...int[] b =...int[] result =newint[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();
Zgodnie z tą odpowiedzią SO , zip był we wcześniejszej wersji beta Java 8, a następnie wyjęty. Na szczęście plakat miał źródło i jest w odpowiedzi. Użyłem kodu kilka razy i wydaje się, że działa bardzo dobrze.
Możesz zmienić tablicę w strumień, używając Arrays.stream():
int[] ns =newint[]{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 =newint[]{1,2,3,4,5};int[] ms =Arrays.stream(ns).map(n -> n *2).filter(n -> n %4==0).toArray();
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, ...
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();