首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >坚持使用Java 8流

坚持使用Java 8流
EN

Stack Overflow用户
提问于 2018-10-11 22:57:45
回答 2查看 272关注 0票数 3

我正在尝试学习如何在Java 8中使用Streams,但不确定如何在这里开始。

我有一份课程清单。我需要知道一个学期的所有课程是否都没有学生,如果是这样的话,做点什么。我想出了下面的代码,但这是在迭代任何没有任何学生的课程时立即给出空指针异常。我需要知道如何更正它:

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-11 23:30:32

在实际代码中,NullPointerException可能来自coursenull,或者course.getStudents()null

这个过滤器filter(Objects :: nonNull)是无能为力的。它不会过滤null Student,这不是您的要求。

此代码应该是您要查找的代码:

代码语言:javascript
复制
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检查并不好:它会降低“真正的逻辑”的可读性。

您至少可以通过在集合字段的声明中对其进行初始化来避免它们,例如:

代码语言:javascript
复制
public class Semester{
 int semId;
 List<Course> courses = new ArrayList<>();
}

public class Course{
 int courseId;
 List<Student> students = new ArrayList<>();
}
票数 3
EN

Stack Overflow用户

发布于 2018-10-11 23:18:20

代码语言:javascript
复制
boolean allCourseHaveEmptyStudens=semester.getCourses().stream()
.allMatch(c-> c.getStudents()==null || c.getStudents().size==0)
;

我想这足以满足你的要求了。

注意:它可能会得到一个编译错误,因为我没有使用编辑器工具。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52763226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档