2017-08-21 10 views
2

我有一個雙精度數組,我想從另一個數組中依次賦值0..n。例如:r[0] = sum(a[0..n]), r[1] = sum(a[1..n]), r[m] = sum(a[m..n]) where m <= n用Java 8數據流以函數方式生成一個數組的連續和

這是容易做到與循環:

int n = a.length; 
for (int i = 0; i < n; i++) { 
    double sum = 0.; 
    for (int j = i; j < n; j++) 
     sum += a[j]; 
    r[i] = sum; 
} 

有一個靈活的方式以功能性方式來做到這一點在Java中8流?隨着庫StreamEx我可以像親近:

for (int i = 0; i < n; i++) 
    r[i] = DoubleStreamEx.of(a).skip(i).sum(); 

我真的不關心性能,這是更多的練習,以瞭解流。

+0

'n <= a.length'? – shmosel

+0

*「這對於循環來說是微不足道的」*可能微不足道,但你仍然設法做得不好(_O(n^2)_)。該操作可以通過一個循環完成(_O(n)_)。要使用流進行此操作,您需要一個自定義的「收集器」,而且它遠離最佳性能。使用'for'循環可以很容易地實現最佳性能(即使您設法搞砸了它也很容易),那麼爲什麼要使用次循環代碼,當一個for循環會執行? – Andreas

+1

正如我所說的,我不關心性能 – skippy

回答

1
double[] r = IntStream.range(0, n) 
     .mapToDouble(m -> Arrays.stream(a, m, n).sum()) 
     .toArray();