我正在尝试学习如何在Java 8中使用Streams,但不确定如何在这里开始。
我有一份课程清单。我需要知道一个学期的所有课程是否都没有学生,如果是这样的话,做点什么。我想出了下面的代码,但这是在迭代任何没有任何学生的课程时立即给出空指针异常。我需要知道如何更正它:
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;
}
发布于 2018-10-11 23:30:32
在实际代码中,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<>();
}
发布于 2018-10-11 23:18:20
boolean allCourseHaveEmptyStudens=semester.getCourses().stream()
.allMatch(c-> c.getStudents()==null || c.getStudents().size==0)
;
我想这足以满足你的要求了。
注意:它可能会得到一个编译错误,因为我没有使用编辑器工具。
https://stackoverflow.com/questions/52763226
复制相似问题