我正在尝试学习如何在Java 8中使用Streams,但是不确定如何在此处进行操作。
我有一个课程列表。我需要知道一个学期的所有课程是否都没有学生,如果是,那就做点什么。我想出了以下代码,但这会在没有任何学生的任何课程被迭代时立即给出Null Pointer Exception。我需要知道如何纠正它:
List<Student> students = semester.getCourses().stream().flatMap(course -> course.getStudents().stream())
.filter(Objects :: nonNull).collect(toList());
if (CollectionUtils.isEmpty(students)){
//cancel the semester or do something
}
public class Semester{
int semId;
List<Course> courses;
}
public class Course{
int courseId;
List<Student> students;
}
答案 0 :(得分:3)
boolean allCourseHaveEmptyStudens=semester.getCourses().stream()
.allMatch(c-> c.getStudents()==null || c.getStudents().size==0)
;
我认为足以满足您的要求。
注意:由于我不使用编辑器工具,因此可能会出现编译错误。
答案 1 :(得分:3)
在实际代码中,NullPointerException
可能来自course
是null
或course.getStudents()
是null
。
此过滤器filter(Objects :: nonNull)
无助。它不会过滤null
Student
,这不是您的要求。
这段代码应该是您想要的:
List<Student> students =
semester.getCourses()
.stream()
.filter(Objects::nonNull) // filter out null Course objects
.map(Course::getStudents)
.filter(Objects::nonNull) // filter out null Student List
.flatMap(Collection::stream)
.collect(toList());
还请注意,在所有位置添加null检查都是不好的:这会使“真实逻辑”的可读性降低。
通过至少在它们的声明中将它们初始化,您可以至少避免使用这些字段:
public class Semester{
int semId;
List<Course> courses = new ArrayList<>();
}
public class Course{
int courseId;
List<Student> students = new ArrayList<>();
}