可直接用Stream.collect(Collectors.averagingDouble())计算学生分数平均值,需Student类提供double型getScore()方法;空集合返回0.0,NaN/Infinity需提前过滤;更推荐mapToDouble+average().orElse(0.0)方式。

直接用 Stream.collect(Collectors.averagingDouble()) 可以快速计算学生列表中某项分数字段的平均值,前提是学生对象有对应的 double 类型成绩属性(或能转为 double 的方法)。
确保学生类有可提取的成绩字段
比如学生类 Student 中有一个 getScore() 方法,返回 double 或可自动装箱的 Double:
public class Student {
private String name;
private double score;
// 构造、getter 等略
public double getScore() { return score; }
}
调用 collect + averagingDouble 提取并计算
使用 Collectors.averagingDouble() 传入一个 ToDoubleFunction,即从每个学生对象中取出分数的逻辑:
List<Student> students = Arrays.asList(
new Student("张三", 85.5),
new Student("李四", 92.0),
new Student("王五", 78.5)
);
double avgScore = students.stream()
.collect(Collectors.averagingDouble(Student::getScore));
System.out.println(avgScore); // 输出:85.33333333333333
注意空集合和 null 值的处理
- 如果列表为空,
averagingDouble返回0.0(不是NaN或异常) - 如果某个学生
getScore()返回NaN或Infinity,结果也会是NaN或对应值,需提前过滤 - 若成绩字段可能为
null(如类型是Double),建议先用filter(Objects::nonNull)或mapToDouble(s -> s.getScore() != null ? s.getScore() : 0.0)
替代写法:用 mapToDouble 更直观(适合简单场景)
如果只是求平均分,不用 collect 也能实现:
double avg = students.stream()
.mapToDouble(Student::getScore)
.average()
.orElse(0.0); // 空流时返回默认值
这个方式更轻量,且 OptionalDouble.orElse() 明确控制空情况,推荐在不需要其他收集操作时使用。


















