В фактическом коде NullPointerException
может быть от course
до null
или course.getStudents()
до null
.
Этот фильтр filter(Objects :: nonNull)
беспомощен.Он не фильтрует null
Student
s, и это не ваше требование.
Этот код должен быть тем, что вы ищете:
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());
Обратите внимание, что добавление нулевых проверок вездене хорошо: это делает «реальную логику» менее читабельной.
Вы можете, по крайней мере, избежать их для полей коллекции, инициализируя их в их объявлениях, таких как:
public class Semester{
int semId;
List<Course> courses = new ArrayList<>();
}
public class Course{
int courseId;
List<Student> students = new ArrayList<>();
}