2016-04-29 6 views
0

は一例で構築:RxJava /アンドロイド:ここでは、元のアイテムの組み合わせとして観察可能と変換項目

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を常に観測可能なものに変換したくないのです。

変換されたアイテムに基づいて元のアイテムを参照できる他の良い方法はありますか?

+0

はdoOnNext演算子を使用します。 – JohnWowUs

+0

@JohnWowUs私に例を教えてください。 –

答えて

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(); 
+0

さて、このように、私たちはまだすべての 'flatMap()'または他の演算子に学生を入れなければなりません。私は 'Pair 'を使うのに比べて大きな違いはないと思います。 –

+0

@shawn_wxあなたの質問には他の操作はありません。現在私のソリューションはあなたが求めていることを行います:学生とコースを印刷します。質問にさらに要件を追加することができます。 – AndroidEx

+0

私は私の質問で言及した、私が尋ねる理由は、変形中に元のアイテム(生徒)を全部保持したくないということです。私が学生とコースを印刷したいだけなら、私はペアを使うことができます。 –

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) { } 
     }); 
+0

これは単にペアを出力します。それほど有用ではありませんが、あなたが求めたことをします。 – JohnWowUs

関連する問題