原始代碼存在嚴重邏輯錯誤:
package com.example.array;
public class ArrayStatistics {
public static void main(String[] args) {
// 模擬學生 Java 成績
double[] scores = {34.0, 24.0, 78.0, 99.0, 100.0};
if (scores.length == 0) {
System.out.println("陣列為空");
return;
}
double sum = 0;
double max = scores[0];
double min = scores[0];
for (double score : scores) {
sum += score;
if (score > max) max = score;
if (score < min) min = score;
}
double avg = sum / scores.length;
System.out.printf("平均分:%.2f%n", avg);
System.out.println("最高分:" + max);
System.out.println("最低分:" + min);
}
}
import java.util.Arrays;
import java.util.OptionalDouble;
public class ArrayStatisticsModern {
public static void main(String[] args) {
double[] scores = {34.0, 24.0, 78.0, 99.0, 100.0};
// 並行流處理大數據量更高效
OptionalDouble avgOpt = Arrays.stream(scores).average();
OptionalDouble maxOpt = Arrays.stream(scores).max();
OptionalDouble minOpt = Arrays.stream(scores).min();
if (avgOpt.isPresent()) {
System.out.printf("平均分:%.2f%n", avgOpt.getAsDouble());
System.out.println("最高分:" + maxOpt.getAsDouble());
System.out.println("最低分:" + minOpt.getAsDouble());
}
// 一次性獲取所有統計量(最高效)
DoubleSummaryStatistics stats = Arrays.stream(scores)
.collect(Collectors.summarizingDouble(d -> d));
System.out.printf("平均:%.2f, 最大:%.2f, 最小:%.2f, 總和:%.2f, 個數:%d%n",
stats.getAverage(), stats.getMax(), stats.getMin(), stats.getSum(), stats.getCount());
}
}
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
class Student {
private String name;
private double javaScore;
public Student(String name, double javaScore) {
this.name = name;
this.javaScore = javaScore;
}
// getter 省略
public double getJavaScore() { return javaScore; }
public String getName() { return name; }
}
public class StudentScoreStats {
public static void main(String[] args) {
List students = List.of(
new Student("張揚", 34),
new Student("劉禪", 24),
new Student("張燕", 78),
new Student("周少博", 99),
new Student("張旭", 100)
);
// 方式一:Stream 統計
DoubleSummaryStatistics stats = students.stream()
.collect(Collectors.summarizingDouble(Student::getJavaScore));
System.out.printf("平均分:%.2f%n", stats.getAverage());
System.out.println("最高分:" + stats.getMax() + " (" +
students.stream().max(Comparator.comparing(Student::getJavaScore)).get().getName() + ")");
System.out.println("最低分:" + stats.getMin() + " (" +
students.stream().min(Comparator.comparing(Student::getJavaScore)).get().getName() + ")");
// 方式二:並行處理大量數據
// students.parallelStream().collect(...)
}
}
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| for 迴圈 | 極簡場景、嵌入式、Android 老版本 | 零開銷、完全控制 | 樣板代碼多、易出錯 |
| Stream API | 現代 Java 應用、業務邏輯 | 可讀性強、函數式、並行友好 | 微小開銷、調試稍難 |
| DoubleSummaryStatistics | 需多統計量同時獲取 | 單次遍歷、數值穩定算法 | 僅限基本型別流 |
| Apache Commons Math | 科學計算、統計分析 | 豐富統計函數 | 引入重依賴 |
陣列統計看似簡單,實則暗藏邏輯錯誤與精度陷阱。現代 Java 開發首選 DoubleSummaryStatistics 或 Stream API,既消除了手寫迴圈的低級錯誤,又提供了並行處理與數值穩定性保障。記住:不要重複造輪子,標準庫已經幫你處理好邊界情況。