2014-06-24 20 views

Odpowiedz

248

Istnieją nowe metody dodane do java.util.Arrays przekonwertować tablicę w Java 8 strumienia, które mogą być następnie wykorzystywane do zsumowanie itp

int sum = Arrays.stream(myIntArray) 
       .sum(); 

mnożenia dwóch macierzy jest nieco trudniejsze, ponieważ Nie mogę wymyślić sposób, aby uzyskać wartość I indeks w tym samym czasie, co operacja Stream. Oznacza to, że prawdopodobnie będziesz musiał przesyłać strumieniowo 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]); 

EDIT

Commenter @Holger wskazuje, można użyć metody map zamiast forEach tak:

int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray(); 
+11

'Int [], wynik = IntStream.range (0 a.length) .map (i-> a [i] * B [i]) toArray().' – Holger

+0

@ Hger tak, to też by działało. Chociaż prawdopodobnie chcesz użyć 'mapToInt', aby uniknąć boksowania. – dkatzel

+0

To ostatnie oznacza symulację zip, w której należy wstępnie przydzielić miejsce do przechowywania wyników. Zastanawiam się, dlaczego nie ma zip w bibliotece strumieni? –

51

Można włączyć tablicę do strumienia za pomocą Arrays.stream():

int[] ns = new int[] {1,2,3,4,5}; 
Arrays.stream(ns); 

Po utworzeniu strumienia można użyć dowolnej z metod opisanych w artykule the documentation, na przykład sum() lub cokolwiek innego. Można map lub filter jak 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, wtedy nazywamy toArray() przekonwertować go z powrotem do tablicy 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(); 
5

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 

Suma powyżej nie jest 2 * Integer.MIN_VALUE. Musisz to zrobić w tym przypadku.

long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct 
Powiązane problemy