通过在第二个发射事件时从第一个采样组合其他Observable来创建一个Observable

时间:2016-10-21 01:57:57

标签: rx-java reactive-programming

当一个是无限数据源时,我需要组合两个观察者,另一个是从第一个获取最后一个值的指标。 我会在这里画出我想要的图像: enter image description here

我看过http://reactivex.io/documentation/operators.html#combining,但没有一个符合我的要求。

4 个答案:

答案 0 :(得分:4)

public final Observable sample(Observable sampler) http://reactivex.io/RxJava/javadoc/rx/Observable.html#sample(rx.Observable)

答案 1 :(得分:2)

尝试withLatestFrom(它标记为实验性但它已经在RxJava API中存在了一段时间)

Observable<Long> interval = Observable.interval(500, TimeUnit.MILLISECONDS);
Observable<Long> slowerInterval = Observable.interval(2, TimeUnit.SECONDS);
slowerInterval.withLatestFrom(interval, new Func2<Long, Long, Long>() {
     @Override
            public Long call(Long first, Long second) {
                return second;
            }
})  

答案 2 :(得分:1)

使用flatMap

可以很容易地实现这一点
observable2
    .flatMap(value -> observable1.take(1))

答案 3 :(得分:0)

我使用interval运算符创建了一个小例子。

Observable<Long> interval = Observable.interval(500, TimeUnit.MILLISECONDS);
Observable<Long> slowerInterval = Observable.interval(2, TimeUnit.SECONDS);
Observable.combineLatest(
            interval,
            slowerInterval,
            new Func2<Long, Long, Long>() {

                Long previousSecond = null;

                @Override
                public Long call(Long first, Long second) {
                    if (!second.equals(previousSecond)) {
                        previousSecond = second;
                        return first;
                    } else {
                        return null;
                    }
                }
            })
            .filter(value -> value != null)
            .subscribe(new Subscriber<Long>() {
                @Override
                public void onNext(Long value) {
                    // Value gets emitted here every time slowerInterval emits
                }

                ...
            });

说明:由于combineLatest的工作方式,我需要缓存第二个observables值,并在从第一个可观察下游发出值之前检查它是否已更改。如果它没有改变,我会发出null,然后将其过滤掉。可能有更优雅的方式来做到这一点,但我无法想到一个。