2014-06-24 46 views
153

我剛剛發現了新的Java 8流功能。來自Python,我想知道現在是否有一種簡潔的方式來執行像求和這樣的數組操作,將兩個數組以「一行pythonic」的方式相乘?Java 8流和陣列上的操作

由於

回答

248

有加入到java.util.Arrays到一個數組轉換爲隨後可被用於求和等

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

相乘兩個陣列一個Java 8流的新方法是有點困難,因爲我不能想到一種方法來獲得值和索引在一個流操作的同時。這意味着你可能必須流過數組的索引。

//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]); 

編輯

批評家@Holger指出,你可以用它代替forEach這樣的map方法:

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

'INT []結果= IntStream.range(0,則爲a.length).MAP(I-> A [1] * B [1])的toArray();' – Holger

+0

@Holger是的,這也可以。儘管你可能想使用'mapToInt'來避免裝箱。 – dkatzel

+0

最後等於模擬zip,您必須爲結果預分配存儲空間。我想知道爲什麼Streams庫中沒有壓縮文件? –

51

您可以通過使用Arrays.stream()把一個數組流:

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

一旦你有了流,你可以使用the documentation中描述的任何方法,比如sum()或其他。您可以mapfilter如同在Python中通過調用lambda函數,相關數據流的方法:

Arrays.stream(ns).map(n -> n * 2); 
Arrays.stream(ns).filter(n -> n % 4 == 0); 

一旦你完成修改您的流,然後調用toArray()將其轉換回一個數組在其他地方使用:

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

如果您必須處理大量數據,請小心。

int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE}; 
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0 

以上總和不是2 * Integer.MIN_VALUE。 您需要在這種情況下執行此操作。

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