0

のは、私は次のコードを持っているとしましょう:それは生産FlatMapとサブジェクト - サブスクライバーの複製を避けるにはどうすればよいですか?

BehaviorSubject<Integer> subject = BehaviorSubject.create(); 
BehaviorSubject<Integer> subject2 = BehaviorSubject.create(); 
subject. 
     doOnNext(number -> subject2.onNext(number)). 
     flatMap(number -> subject2). 
     subscribe(number -> System.out.println("Number " + number)); 

for(int i = 0; i < 10; i++) { 
    subject.onNext(i); 
} 

出力は次のようになります。

Number 0 
Number 1 
Number 1 
Number 2 
Number 2 
Number 2 
Number 3 
Number 3 
Number 3 
Number 3 
Number 4 
Number 4 
Number 4 
Number 4 
Number 4 

を、オン、オン。

なぜそれが起こるのか理解します。それは、flatMapが呼び出されるたびに、新しいサブスクライバがsubject2に追加されるためです。

質問です - これを避ける方法は?

答えて

1

あなたはこのようflatMap内の一つの要素にsubject2を制限することができます。

flatMap(number -> subject2.first())

コード

BehaviorSubject<Integer> subject = BehaviorSubject.create(); 
    BehaviorSubject<Integer> subject2 = BehaviorSubject.create(); 
    subject. 
      doOnNext(number -> subject2.onNext(number)). 
      flatMap(number -> subject2.first()). 
      subscribe(number -> System.out.println("Number " + number)); 

    for(int i = 0; i < 10; i++) { 
     subject.onNext(i); 
    } 

switchMap代わりのflatMapを試し重複

関連する問題