我想在Collection with Streams中计算集合中的集合数

时间:2016-09-02 19:59:11

标签: java java-8 java-stream

我们假设我有一个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)

2 个答案:

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