假设我有一个SchoolDistrict,其中有许多Schools,有许多Students,其中有许多Classes

我想计算一个SchoolDistrict的 class 数量。

Java 7的方式如下所示:

Integer classCount = 0;
for (School school : schoolDistrict)
{
    for (Student student : school.getStudents())
    {
        classCount += student.getClasses().size();
    }
}

我知道Java 8带来了流,这些流应该使这种事情在眼睛上更容易些。

但是我很难弄清楚该怎么做。

有没有人?

编辑:有人将其标记为this post的重复,我不认为这是因为该示例仅深入了2个级别(“国家/地区”)。我的问题与一个深入到四个层次的问题有关(学校的校区,学生的上课范围)

最佳答案

这使用方法引用来完成工作,而无须lambdas:

int classCount = schoolDistrict.stream()
  .map(School::getStudents)
  .flatMap(Collection::stream)
  .map(Student::getClasses)
  .mapToInt(Collection::size)
  .sum();

还要注意,切换到每个学生 class 大小的IntStream,然后应用sum(),这当然比为每个学生流每个 class 并迭代地计算 class 效率更高。

07-24 09:49