Застрял с использованием потока Java 8 - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь узнать, как использовать Streams в Java 8, но не знаю, как это сделать.

У меня есть список курсов.Мне нужно знать, если на всех курсах в течение семестра нет студентов, и если это так, сделайте что-нибудь.Я придумал приведенный ниже код, но это дает исключение нулевого указателя, как только любой курс повторяется, в котором нет студентов. Мне нужно знать, как я могу это исправить:

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;
}

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

В фактическом коде 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<>();
}
0 голосов
/ 11 октября 2018
boolean allCourseHaveEmptyStudens=semester.getCourses().stream()
.allMatch(c-> c.getStudents()==null || c.getStudents().size==0)
;

Я думаю, этого достаточно, чтобы выполнить ваше требование.

Примечание. Может возникнуть ошибка компиляции, поскольку я не использую инструмент редактора.

...