Tính giá trị trung bình (average) của các số trong List<Integer> hoặc List<Double>.
Cách 1: Stream API + IntSummaryStatistics (Java 8+, khuyên dùng)
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List list = Arrays.asList(10, 20, 50, 100, 130, 150, 200, 250, 500);
IntSummaryStatistics stats = list.stream()
.mapToInt(Integer::intValue)
.summaryStatistics();
System.out.println("Average: " + stats.getAverage());
System.out.println("Count: " + stats.getCount());
System.out.println("Sum: " + stats.getSum());
System.out.println("Min: " + stats.getMin());
System.out.println("Max: " + stats.getMax());
}
}
Kết quả
Average: 156.66666666666666 Count: 9 Sum: 1410 Min: 10 Max: 500
Cách 2: Stream API reduce (Java 8+)
List list = Arrays.asList(10, 20, 50, 100, 130, 150, 200, 250, 500);
double avg = list.stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0.0); // hoặc orElseThrow()
System.out.println("Average: " + avg);
Cách 3: Vòng lặp truyền thống (Tất cả phiên bản Java)
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List list = Arrays.asList(10, 20, 50, 100, 130, 150, 200, 250, 500);
if (list.isEmpty()) {
System.out.println("Empty list!");
return;
}
long sum = 0;
for (int i : list) {
sum += i;
}
double average = (double) sum / list.size();
System.out.println("Average = " + average);
}
}
Kết quả
Average = 156.66666666666666
Cách 4: Cho List<Double> / List<Long> / Number chung
import java.util.List;
public class GenericAverage {
public static double average(List list) {
if (list == null || list.isEmpty()) {
throw new IllegalArgumentException("List không được rỗng");
}
return list.stream()
.mapToDouble(Number::doubleValue)
.average()
.orElseThrow();
}
public static void main(String[] args) {
List doubles = List.of(1.5, 2.5, 3.0);
List longs = List.of(10L, 20L, 30L);
System.out.println("Double avg: " + average(doubles)); // 2.333...
System.out.println("Long avg: " + average(longs)); // 20.0
}
}
Cách 5: Apache Commons Math (Thư viện ngoài)
// Dependency: org.apache.commons:commons-math3:3.6.1
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
DescriptiveStatistics stats = new DescriptiveStatistics();
for (int v : list) stats.addValue(v);
double mean = stats.getMean();
So sánh
| Cách | Ưu điểm | Nhược điểm | Phiên bản |
|---|---|---|---|
| IntSummaryStatistics | Lấy được count, sum, min, max cùng lúc | Chỉ cho primitive int/long/double | Java 8+ |
| Stream.average() | Ngắn gọn, functional | Chỉ trả về average | Java 8+ |
| Vòng lặp for | Hiểu dễ, không tạo object rác, dùng cho mọi Number | Code dài hơn | Tất cả |
| Generic | Tái dùng cho Double, Long, Float... | Boxing/unboxing overhead | Java 5+ |
Lưu ý về độ chính xác
- Dùng
doublecho trung bình - có thể mất độ chính xác với số rất lớn. - Cần độ chính xác tuyệt đối: dùng
BigDecimal. - Tránh chia integer:
sum / list.size()→ kết quả int. Phải ép:(double) sum / size.
Xử lý List rỗng
// Cách an toàn
double avg = list.isEmpty() ? 0.0 : list.stream().mapToInt(i -> i).average().orElse(0.0);
// Hoặc ném exception
double avg = list.stream().mapToInt(i -> i).average().orElseThrow(
() -> new IllegalStateException("List rỗng"));