使用Java stream计算Arrays.asList中Student对象两个成绩的平均值
问题解答
错误原因
你原有代码运行结果异常的核心问题有两个:
- 误用了运算符:
student.getSpecialSubjectGrade() & student.getCommonSubjectGrade()中的&是Java的位与运算符,不是你需要的求和运算符+,运算结果不是两个成绩的总和 - 业务逻辑不匹配:你需要计算的是单个学生的两个成绩的平均值,而原有代码是将位与运算得到的单个数值再求平均值,逻辑完全不符。
正确实现方案
Java Stream完全可以实现该需求,正确代码如下:
double averageGradeOfTheCertainStudent = students.stream() // 筛选指定姓名的学生 .filter(student -> "Petyr Baelish".equals(student.getName())) // 直接计算当前学生双科成绩的平均值 .mapToDouble(student -> (student.getCommonSubjectGrade() + student.getSpecialSubjectGrade()) / 2.0) // 获取结果取值,此处如果学生不存在时抛出异常提示,避免空指针问题 .findFirst() .orElseThrow(() -> new RuntimeException("未找到匹配的学生信息")); System.out.println("Average grade of Petyr Baelish = " + averageGradeOfTheCertainStudent);
运行后会得到正确结果6.5。
如果你需要批量计算所有学生各自的双科平均成绩,可使用以下写法:
students.stream().forEach(student -> { double avg = (student.getCommonSubjectGrade() + student.getSpecialSubjectGrade()) / 2.0; System.out.println(student.getName() + "的双科平均成绩为:" + avg); });
内容的提问来源于stack exchange,提问作者Shubt
相关产品推荐
相关产品推荐

