RxJava2的Filter和flatMap举例操作

场景:发送所有学生得到结果为:学生0,2的对应id = 1,3的课程

public  static void demoFunc5(){
  //构建数据
    final List list = new ArrayList<>();
    for(int i = 0 ; i < 3 ; ++i){
        Student stu = new Student();
        stu.id = i;
        stu.name ="学生"+i;
        List courses = new ArrayList<>();
        for(int j = 0 ; j < 4 ; ++j){
            Student.Course course = new Student.Course();
            course.setName(stu.name+"的课程"+j);
            course.setId(j);
            courses.add(course);
        }

        stu.setCourseList(courses);
        list.add(stu);
    }

    /*创建observable将所有学生发送*/
   Observable.create(new ObservableOnSubscribe() {
       @Override
       public void subscribe(ObservableEmitter e) throws Exception {
           for(Student student : list) {//发射所有学生实例
               e.onNext(student);
           }
       }
   })
            /*筛选学生:这里是学生id为0或2*/
           .filter(new Predicate() {
       @Override
       public boolean test(Student student) throws Exception {
           return student.id == 0 || student.id == 2;
       }
   })
           /*将学生的课程发送出去,从学生实例得到课程实例,再发射出去*/
           .flatMap(new Function>() {
       @Override
       public ObservableSource apply(Student student) throws Exception {
          Log.d(TAG,"flatmap student name = "+student.name);
           return Observable.fromIterable(student.getCourseList()).delay(10, TimeUnit.MILLISECONDS);
       }
   })
           /*得到课程再筛选id为1或3的课程*/
           .filter(new Predicate() {
               @Override
               public boolean test(Student.Course course) throws Exception {
                   return course.getId() == 1||course.id == 3;
               }
           })
           /*接受到学生的课程*/
           .subscribe(new Consumer() {
       @Override
       public void accept(Student.Course course) throws Exception {
           Log.d(TAG,"Consumer accept course = "+course.getName());
       }
   });

}
private static class Student{
    private int id;
    private String name;
    private String sex;
    private List courseList;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public List getCourseList() {
        return courseList;
    }

    public void setCourseList(List courseList) {
        this.courseList = courseList;
    }

    public static class Course{
       private int id;
       private String name;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

Log输出结果为:

11-20 17:25:36.868 7214-7214/? D/RxJavaDemo1: flatmap student name = 学生0
11-20 17:25:36.881 7214-7214/? D/RxJavaDemo1: flatmap student name = 学生2
11-20 17:25:36.892 7214-7236/? D/RxJavaDemo1: Consumer accept course = 学生0的课程1
11-20 17:25:36.893 7214-7236/? D/RxJavaDemo1: Consumer accept course = 学生0的课程3
11-20 17:25:36.894 7214-7237/? D/RxJavaDemo1: Consumer accept course = 学生2的课程1
11-20 17:25:36.895 7214-7237/? D/RxJavaDemo1: Consumer accept course = 学生2的课程3

你可能感兴趣的:(RxJava2的Filter和flatMap举例操作)