RxJava / Android:将Observable构造为原始项和转换项的组合

时间:2016-04-29 04:28:56

标签: android rx-java reactive-programming

以下是示例:

Student[] students = ...;
Subscriber<Course> subscriber = new Subscriber<Course>() {
    @Override
    public void onNext(Course course) {
        Log.d(tag, course.getName());
    }
    ...
};
Observable.from(students)
    .flatMap(new Func1<Student, Observable<Course>>() {
        @Override
        public Observable<Course> call(Student student) {
            return Observable.from(student.getCourses());
        }
    })
    .subscribe(subscriber);

观察课程很容易,但如果我想打印出这对学生课程怎么办?是否有必要将Observable<Course>更改为Observable<Pair<Student, Course>>?这种方法可能非常繁琐,因为在转换过程中我们可能有多个运算符,但我们不希望Pairs一直保持变换observable。

我们可以根据转换过的那个参考原始项目吗?

2 个答案:

答案 0 :(得分:0)

根据您的目标和实施情况,您可以使用flatMap这样的重载变体:

Observable.from(students)
        .flatMap(new Func1<Student, Observable<Course>>() {
            @Override
            public Observable<Course> call(Student student) {
                return Observable.from(student.getCourses());
            }
        }, new Func2<Student, Course, Void>() {
            @Override
            public Void call(Student student, Course course) {
                Log.d(tag, student + "->" + course.getName());
                return null;
            }
        })
        .subscribe();

答案 1 :(得分:0)

students.doOnNext(new Action1<String>() {
            @Override
            public void call(String student) {
                ArrayList<String> studentCourses = courses.get(student);
                for (int i=0 ; i<studentCourses.size() ; i++) {
                    System.out.println(student + " -> " + studentCourses.get(i) + " " + test);
                }
            }
        })
       .subscribe(new Subscriber<String>() {
        @Override
        public void onNext(String s) { /*System.out.println(s); */}

        @Override
        public void onCompleted() { }

        @Override public void onError(Throwable e) { }
       });