如何从过滤后的Observable中获取类似BehaviorSubject的行为?

时间:2015-06-15 22:17:00

标签: rx-java

我有一个Observable,我已经应用了一个过滤器。我希望从中获得类似于BehaviorSubject的语义,这样订阅时订阅者就会收到通过过滤器的最后一项。但是,BehaviorSubject似乎并没有设计成卡在链的中间,而只是作为一个源。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:3)

您可以使用compose来链接它们,例如:

public class BehaviorSubjectTransformer<T> implements Observable.Transformer<T, T> {

    @Override
    public Observable<T> call(Observable<T> o) {
        BehaviorSubject<T> subject = BehaviorSubject.create();
        o.subscribe(subject);
        return subject;
    }

    public static <T> Observable.Transformer<T, T> create() {
        return new BehaviorSubjectTransformer<T>();
    }
}

@Test
public void foo() {
    Observable<Integer> o = Observable.just(1, 2, 3).concatWith(Observable.never()).compose(BehaviorSubjectTransformer.create());
    o.subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer v) {
            System.out.println("1: " + v);
        }
    });
    o.subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer v) {
            System.out.println("2: " + v);
        }
    });
}