方差 = 平均[(x - 平均值)²]。數據:40,30,50,80 → 平均 50 → 方差 350。
public static double varianceImperative(double[] pop) {
double avg = 0;
for (double p : pop) avg += p;
avg /= pop.length;
double var = 0;
for (double p : pop) var += (p-avg)*(p-avg);
return var / pop.length;
}
狀態修改、順序迭代,適配單核 CPU。
public class ForkJoinCalculator extends RecursiveTask {
static final long THRESHOLD = 1_000_000;
// ... 遞歸分割數組,子任務 fork/join,最後聚合
}
手動管理任務分割、同步、聚合,代碼量大、除錯難。
public static double varianceStreams(double[] pop) {
double avg = Arrays.stream(pop).parallel().average().orElse(0);
double var = Arrays.stream(pop).parallel()
.map(p -> (p-avg)*(p-avg))
.sum() / pop.length;
return var;
}
聲明式:描述「做什麼」而非「怎麼做」。庫自動優化並行。注意:Stream 只能消費一次,需重新創建。
| 版本 | 耗時 |
|---|---|
| 命令式 | 60 ms |
| Fork/Join | 22 ms |
| 並行 Streams | 46 ms |

結論:Java 8 Streams API 讓並行編程普及化,聲明式風格開啟庫級優化大門。
作者:Raoul-Gabriel Urma 等,《Java 8 in Action》節選
出處:bianceng.cn