我们假设我有一个SchoolDistrict
,其中包含许多Schools
Students
,其Classes
多个Integer classCount = 0;
for (School school : schoolDistrict)
{
for (Student student : school.getStudents())
{
classCount += student.getClasses().size();
}
}
。
我想计算给予SchoolDistrict的课程数量。
Java 7的方式如下:
php artisan make:auth
我知道Java 8带来的流应该会使这种事情变得更加容易。
但我无法弄清楚如何去做。
任何参赛者?
编辑:有人将此标记为this post的副本,我不相信这是因为该示例仅深入2级(国家/地区)。我的问题涉及一个深入四个层次的问题(SchoolDistricts to Schools to Students to Classes)
答案 0 :(得分:5)
这使用方法引用来完成没有lambdas的工作:
int classCount = schoolDistrict.stream()
.map(School::getStudents)
.flatMap(Collection::stream)
.map(Student::getClasses)
.mapToInt(Collection::size)
.sum();
另请注意,切换到每个学生班级的尺寸的IntStream
,然后应用sum()
,这当然比为每个学生流式传输每个班级更有效率迭代地计算类。
答案 1 :(得分:4)
您可以使用schoolDistrict.stream().flatMap(school -> school.getStudents().stream())
获取Stream<Student>
。您还可以进一步flatMap()
获得Stream<YourClass>
。这是您需要处理嵌套集合的每个实体时。如果您只需要计算金额,则可以使用mapToInt()
和sum()
作为结束操作。
所以flatMap()
是取消或“扁平化”的秘诀。嵌套集合。
Stream<MyClass> stream = schoolDistrict.stream().flatMap(s -> s.getStudents().stream()).flatMap(s -> s.getClasses().stream());
int count = stream.count();