问题描述
下面的代码段具有访问全局变量的副作用,如何改善此代码段?
double total = 0;
for (Student s : myStudentList){
total = total + s.getSchScore();
}
System.out.println(total + " is total marks.");
解决方法
如果您愿意/能够键入列表(ArrayList<Student> myStudentList = new ArrayList<>();
),则可能的解决方案
final double total = myStudentList.stream()
.mapToDouble(Studen::getScore)
.sum();
如果您必须/想要继续使用原始类型列表(即highly discouraged),那么我建议执行另外两个步骤:过滤掉所有非Student
对象,并将这些对象转换为Student
:
final double total = ((List<?>) myStudentList).stream()
.filter(o -> o instanceof Student)
.map(o -> (Student) o)
.mapToDouble(Studen::getScore)
.sum();
,
强烈建议不要使用原始类型,因为它需要将每个Object强制转换为所需类型。
final double total = myStudentList.stream().mapToDouble(x -> ((Student) x).getStudentMark()).sum();
如果将List
声明为Student
作为类型参数,则代码将大大改善。
List<Student> myStudentList = new ArrayList<>();
//...
final double total = myStudentList.stream().mapToDouble(Student::getStudentMark).sum();