HOWTO · Java
在 Java 中獲取陣列的總和
了解如何使用迴圈與串流在 Java 中求出陣列的總和。
本頁內容
在 Java 中計算 int[] 的總和,簡潔的內建做法是使用 Arrays.stream(numbers).sum();若需要明確控制計算流程,也可以用 for 迴圈逐一加總。Java 陣列本身沒有 sum() 實例方法;Arrays.stream(int[]) 會將值轉成 IntStream,而 IntStream 提供 sum() 和 reduce()。
為陣列求和是 Java 教學 中的核心資料操作之一,它把陣列與集合指南從基礎到串流依次排列。
以下範例使用相同的六個值,總和為 149。每個程式都是完整範例,可儲存為 SimpleTesting.java。
使用 for 迴圈加總 int 陣列
一般的迴圈會清楚呈現每個步驟:設定累加變數、走訪每個索引,再將對應元素加進去。若想逐步掌握計算過程,或在走訪陣列時加入其他邏輯,這是直接明瞭的做法。
這個程式會將 numbers 中的六個值相加並印出總和。迴圈條件使用 numbers.length,並一致地以陣列名稱取得長度及元素。
public class SimpleTesting {
public static void main(String[] args) {
int[] numbers = {12, 34, 45, 21, 33, 4};
int total = 0;
for (int i = 0; i < numbers.length; i++) {
total += numbers[i];
}
System.out.println("Array Sum = " + total);
}
}
Array Sum = 149
使用平行串流與 reduce 加總 int 陣列
若要使用平行串流,可在 Arrays.stream(numbers) 傳回的 IntStream 上呼叫 parallel()。雙參數的 reduce 會接收識別值(0)和加法運算。加法具有結合律,因此可以合併各部分的總和,得到相同結果。對短陣列而言,除非平行處理適合整體工作負載,否則建議使用循序版本;平行執行不會自動讓小型計算變快。
import java.util.Arrays;
public class SimpleTesting {
public static void main(String[] args) {
int[] numbers = {12, 34, 45, 21, 33, 4};
int total = Arrays.stream(numbers)
.parallel()
.reduce(0, (left, right) -> left + right);
System.out.println("Array Sum = " + total);
}
}
Array Sum = 149
使用 Arrays.stream(...).reduce(...) 加總 int 陣列
若要使用循序串流,省略 parallel() 即可。Arrays.stream(int[]) 一樣會傳回 IntStream;reduce(0, Integer::sum) 會以識別值為起點,透過加法合併每個基本型別的值。即使沒有值可供合併,識別值也能讓這項運算有明確定義。
import java.util.Arrays;
public class SimpleTesting {
public static void main(String[] args) {
int[] numbers = {12, 34, 45, 21, 33, 4};
int total = Arrays.stream(numbers).reduce(0, Integer::sum);
System.out.println("Array Sum = " + total);
}
}
Array Sum = 149
使用 Arrays.stream(...).sum() 加總 int 陣列
若要進行的是加法,sum() 比 reduction 更直接地表達意圖。它是由陣列建立的 IntStream 上的終端運算,會傳回 int 總和。
由於這個方法傳回 int,總和會使用 Java 的 32 位元整數算術。若數學上的總和可能超出 int 範圍,請在相加前將串流轉為 long,例如使用 Arrays.stream(numbers).asLongStream().sum()。一般迴圈若要處理這個範圍,也需要使用 long 累加變數,並在相加前將值轉寬。
import java.util.Arrays;
public class SimpleTesting {
public static void main(String[] args) {
int[] numbers = {12, 34, 45, 21, 33, 4};
int total = Arrays.stream(numbers).sum();
System.out.println("Array Sum = " + total);
}
}
Array Sum = 149
使用 IntStream.of(...).sum() 加總 int 陣列
IntStream.of(numbers) 也是從 int[] 建立 IntStream 的直接方式。它的 sum() 運算會傳回與 Arrays.stream(numbers).sum() 相同的總和。可依照哪種寫法在程式中讀起來更自然來選擇。
import java.util.stream.IntStream;
public class SimpleTesting {
public static void main(String[] args) {
int[] numbers = {12, 34, 45, 21, 33, 4};
int total = IntStream.of(numbers).sum();
System.out.println("Array Sum = " + total);
}
}
Array Sum = 149
使用精簡的 for 迴圈加總 int 陣列
以下迴圈將初始化、繼續條件與累加都放在 for 標頭中,並從陣列最後一個索引走訪到第一個索引。這是有效的 Java 寫法,但空的迴圈本體和更新運算式中的遞減操作,讓它比一般迴圈更難快速看懂。除非特別需要精簡寫法,否則建議使用較清楚的形式。
public class SimpleTesting {
public static void main(String[] args) {
int[] numbers = {12, 34, 45, 21, 33, 4};
int total;
int i;
for (total = 0, i = numbers.length - 1;
i >= 0;
total += numbers[i--]) {
// Accumulation happens in the loop update expression.
}
System.out.println("Array Sum = " + total);
}
}
Array Sum = 149