按列表字段过滤对象列表

Moh*_*nIT 2 java collections lambda java-8 java-stream

学生和课程有两个普通对象,如下所示:

public class Student {
    List<Course> courses;
    ...
}
public class Course {
    String name;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我们有一个listStudents,我们怎么能由他们的课程名称进行筛选一些学生的?

  • 首先我尝试flatMap回答这个问题,但它返回课程对象而不是学生对象.
  • 然后我使用allMatch(以下代码).但它会返回学生列表,但List始终为空.问题是什么?
List<Student> studentList;
List<Student> AlgorithmsCourserStudentList = studentList.stream().
    filter(a -> a.stream().allMatch(c -> c.getCourseName.equal("Algorithms"))).
    collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 7

你需要anyMatch:

List<Student> studentList;
List<Student> algorithmsCourseStudentList = 
    studentList.stream()
               .filter(a -> a.getCourses()
                             .stream()
                             .anyMatch(c -> c.getCourseName().equals("Algorithms")))
               .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
  • allMatch只会给你Student他们所有人Course的名字"Algorithms".

  • anyMatch会给你所有Student至少有一个Course名字的人"Algorithms".