我有两个班级:Student
和University
。
public class University {
private String name;
private List<Student> students;
public University(String name) {
this.name = name;
this.students = new ArrayList<Student>();
}
并且有一个计算平均分数的函数:
public double average() {
double average = 0;
for(Student st: students) {
average += st.getKnowledge();
}
try {
return average/students.size();
}
catch(ArithmeticException e) {
System.out.println("Oops, there is no student studying");
return 0.0;
}
}
因此,如果列表中没有学生,我将被除以0,并尝试使用try\catch
块进行处理。
而且我想知道是否有任何方法可以简化此检查,从而避免使用try catch
块?当然,我可以这样实现:
public double average() {
double average = 0;
for(Student st: students) {
average += st.getKnowledge();
}
if (students.size() == 0)
throw new IllegalArgumentException("Oops, there is no student studying");
return average/students.size();
}
两个
if (students.size() == 0)
System.out.println(""Oops, there is no student studying"");
或者可能没有必要进行检查,因为如果students
列表为空,那么它根本就不会进入循环?
我知道这个问题很简单,但我只是在做文章,所以我想在将来知道哪种方法更好。 也许还有一个隐藏的问题或什么?与边界值或其他什么?
提前谢谢。
答案 0 :(得分:2)
这就是if语句在那里的原因。不要限制自己使用它们:)最好是检查方法的开头。像这样:
public double average() {
if(students.isEmpty())
return 0.0;
double average = 0;
for(Student st: students) {
average += st.getKnowledge();
}
return average/students.size();
}
如果您想以更简单的方式对流进行操作,则可以执行以下操作:
private double average(List<Student> students) {
return students.stream()
.mapToDouble(Student::getKnowledge)
.average()
.orElse(0.0);
}
答案 1 :(得分:1)
另一种解决方案是使用摘要统计信息。 https://docs.oracle.com/javase/8/docs/api/java/util/DoubleSummaryStatistics.html 除平均值外,它还包含有关最小值,最大值,总计值及其和的信息。 如果您需要多个汇总值,但又不想创建多个集合流,则它被广泛使用:
public static double average() {
return students.stream()
.mapToDouble(Student::getKnowledge)
.summaryStatistics()
.getAverage();
}
如果您的收藏集为空,默认情况下它将返回0.0。
如果需要多个摘要值,则速度较快,但如果仅需要一个摘要值,则速度较慢。