Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想计算一个集合中的集合数,在一个包含流的集合中_Java_Java 8_Java Stream - Fatal编程技术网

Java 我想计算一个集合中的集合数,在一个包含流的集合中

Java 我想计算一个集合中的集合数,在一个包含流的集合中,java,java-8,java-stream,Java,Java 8,Java Stream,假设我有一个学区,有许多学校,有许多学生,有许多班级 我想计算一个学区的班级数量 Java 7方式是这样的: Integer classCount = 0; for (School school : schoolDistrict) { for (Student student : school.getStudents()) { classCount += student.getClasses().size(); } } 我知道Java8带来的流应该会让这

假设我有一个
学区
,有许多
学校
,有许多
学生
,有许多
班级

我想计算一个学区的班级数量

Java 7方式是这样的:

Integer classCount = 0;
for (School school : schoolDistrict)
{
    for (Student student : school.getStudents())
    {
        classCount += student.getClasses().size();
    }
}
我知道Java8带来的流应该会让这种事情看起来更容易

但我很难想出怎么做

有人要吗


编辑:有人将此标记为的副本,我不相信是这样,因为该示例只深入了两个级别(国家到地区)。我的问题涉及四个层次的问题(学区到学校到学生到班级)

您可以使用
学区.stream().flatMap(school->school.getStudents().stream())
获得
流。您可以进一步执行第二个
flatMap()
以获得
流。此时需要处理嵌套集合的每个实体。如果只需要计算金额,可以使用
mapToInt()
sum()
作为结束操作

因此
flatMap()
是取消测试或“展平”嵌套集合的秘密

Stream<MyClass> stream = schoolDistrict.stream().flatMap(s -> s.getStudents().stream()).flatMap(s -> s.getClasses().stream());
int count = stream.count();
Stream-Stream=schooldirect.Stream().flatMap(s->s.getStudents().Stream()).flatMap(s->s.getClasses().Stream());
int count=stream.count();

这使用方法引用来完成作业:

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

另请注意,切换到每个学生班级大小的
IntStream
,然后应用
sum()
,这当然比为每个学生分流每个班级并迭代计算班级更有效。

@azurefrog,但是我需要更深入地了解我的集合查询,可以尝试以下方法:
schoolDistrict.stream().mapToInt(school->school.getStudents().getClasses().size()).sum()
@Orin2005您不能执行
getStudents().getClasses()
操作,因为
getStudents()
返回一个集合,在这种情况下,该集合不包含
Class
es。哇。。。抱歉,它应该是这样的
schooldirect.stream().flatMap(school->school.getStudents().stream()).flatMap(students->students.getClasses().stream()).mapToInt(classes->classes.getSize()).sum()
为什么用
整数
而不是
整数
?我知道flatMap与此有关。。。但是它在flapMap lambda函数中添加了额外的
.stream()
,我缺少这个函数。很多感谢这看起来有点漂亮。我不认为
.flatMap(List::stream).map
部分会work@Kayaman只使用方法引用(不使用lambda)需要更多步骤,但是我同意它看起来更干净,而且你可以更容易地遵循它。我会在@Bohemian的代码中遇到以下错误:类型不匹配:无法从Stream转换到@Trevor。更一般的是,使用
Collection::Stream
Collection::size
,无论你实际使用哪一个集合,它都会起作用。我本来应该这么做的!(最新答覆)