Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Java: Tìm trung bình của List

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ểmNhược điểmPhiên bản
IntSummaryStatisticsLấy được count, sum, min, max cùng lúcChỉ cho primitive int/long/doubleJava 8+
Stream.average()Ngắn gọn, functionalChỉ trả về averageJava 8+
Vòng lặp forHiểu dễ, không tạo object rác, dùng cho mọi NumberCode dài hơnTất cả
Generic Tái dùng cho Double, Long, Float...Boxing/unboxing overheadJava 5+

Lưu ý về độ chính xác

  • Dùng double cho 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"));