1

Let's say I have the following code:

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);
}

The output it produces is:

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

And on and on.

I understand why it happens - it's because every time flatMap is called, new subscriber is added to subject2.

The question is - how to avoid this?

Vladimir Vagaytsev
  • 2,871
  • 9
  • 33
  • 36

2 Answers2

2

try switchMap instead of flatMap.

switchMap is only ever subscribed to the last Observable it receives. It unsubscribes from all previously subscribed Observables.

http://reactivex.io/RxJava/javadoc/rx/Observable.html#switchMap

Andrew G
  • 2,596
  • 2
  • 19
  • 26
1

You can limit subject2 to one element inside flatMap like this:

flatMap(number -> subject2.first())

Code

    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);
    }

produces output which does not contain duplicates

m.ostroverkhov
  • 1,910
  • 1
  • 15
  • 17