假设我有一个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 效率更高。