如何以命令方式改进此代码段?

问题描述

下面的代码段具有访问全局变量的副作用,如何改善此代码段?

    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();

Ideone demo

如果您必须/想要继续使用原始类型列表(即highly discouraged),那么我建议执行另外两个步骤:过滤掉所有非Student对象,并将这些对象转换为Student

final double total = ((List<?>) myStudentList).stream()
    .filter(o -> o instanceof Student)
    .map(o -> (Student) o)
    .mapToDouble(Studen::getScore)
    .sum();

Ideone Demo

,

强烈建议不要使用原始类型,因为它需要将每个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();