java-8 - 坚持使用 Java 8 流

标签 java-8 java-stream

我正在尝试学习如何在 Java 8 中使用 Streams,但不确定如何在此处着手。

我有一个类(class)列表。我需要知道一个学期的所有类(class)是否都没有学生,如果是这样,就做点什么。我想出了下面的代码,但是一旦迭代任何没有任何学生的类(class),这就会给出 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;
}

最佳答案

在实际代码中 NullPointerException 可能来自 coursenullcourse.getStudents()
这个过滤器 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());

另请注意,到处添加空检查并不好:它会降低“真实逻辑”的可读性。
您至少可以通过在声明中初始化集合字段来避免这些字段,例如:

public class Semester{
 int semId;
 List<Course> courses = new ArrayList<>();
}

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

关于java-8 - 坚持使用 Java 8 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52763226/

相关文章:

java - 两个 URI 对象相等,但它们的 toString() 不同

java - 如何基于自己的 Equal 类消除流中的重复条目

java - 如何将字符串列表映射到空列表?

java - 打印出过滤流对象的一些字段

java - Android Studio 重构恢复所有 lambda 和其他 Java 8 功能

java - Mapstruct结构-错误:(15,35)Java:无法生成从可迭代类型到不可迭代类型的映射方法

java - 认可的 dir 机制不起作用?

Java 8 Stream 从返回值中添加新对象到列表

java - 使用不同的组合器和累加器进行流缩减的示例

java - 在流中创建新对象并使用 setter