Java 平面图和主题-如何避免重复订阅?

Java 平面图和主题-如何避免重复订阅?,java,rx-java,reactive-programming,subject-observer,behaviorsubject,Java,Rx Java,Reactive Programming,Subject Observer,Behaviorsubject,假设我有以下代码: BehaviorSubject<Integer> subject = BehaviorSubject.create(); BehaviorSubject<Integer> subject2 = BehaviorSubject.create(); subject. doOnNext(number -> subject2.onNext(number)). flatMap(number -> subject2).

假设我有以下代码:

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);
}
不断地

我理解为什么会发生这种情况——这是因为每次调用
flatMap
,都会向
subject2
添加新订户


问题是-如何避免这种情况?

您可以将subject2限制为
flatMap
中的一个元素,如下所示:

flatMap(number->subject2.first())

代码

BehaviorSubject subject=BehaviorSubject.create();
BehaviorSubject subject2=BehaviorSubject.create();
主题。
doOnNext(编号->主题2.onNext(编号))。
flatMap(编号->主题2.first()。
订阅(number->System.out.println(“number”+number));
对于(int i=0;i<10;i++){
主题.onNext(i);
}

生成不包含重复项的输出

尝试使用
switchMap
而不是
flatMap

switchMap
只订阅了它接收到的最后一个
可见的
。它取消了所有以前订阅的
Observable
s

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