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
,无论你实际使用哪一个集合,它都会起作用。我本来应该这么做的!(最新答覆)