从 Stream Api 计算 Map 中值的总和

rob*_*801 0 java java-stream

我是一个完全的新手,所以我请你不要说太多脏话)

有一个集合(ArrayList)保存Student类的对象(<HashMap <Subject, Integer> rating, String name>)。我必须使用 Stream API 计算特定科目的平均分数。我尝试这样做:

 sumOnSubjectInGroup = studentsInGroup.stream()
        .filter(e -> e.getRating().entrySet().iterator().next().getKey().equals(subject))
        .mapToInt(e -> e.getRating().entrySet().iterator().next().getValue())
        .reduce(0, (x, y) -> x + y);
 countMarkInGroup = (int) studentsInGroup.stream()
        .filter(e -> e.getRating().entrySet().iterator().next().getKey().equals(subject))
        .count();
 return (double) sumOnSubjectInGroup / countMarkInGroup;
Run Code Online (Sandbox Code Playgroud)

其中 sumOnSubjectInGroup是所有学生的学科分数之和。 countMarkInGroup - 此类标记的数量。 StudentsInGroup是包含所有 Student 对象的集合。 getRating () - 返回一个 HashMap <Subject, Integer> 及其项目和评级列表。但显然我得到了错误的结果

Ekl*_*vya 5

您可以使用.average()计算平均值并使用containsKey检查地图中是否存在来过滤并获取分数。

Double average = studentsInGroup.stream()
            .filter(e -> e.getRating().containsKey(subject))
            .mapToInt(e -> e.getRating().get(subject))
            .average()
            .orElse(0.0);
Run Code Online (Sandbox Code Playgroud)