当一个是无限数据源时,我需要组合两个观察者,另一个是从第一个获取最后一个值的指标。 我会在这里画出我想要的图像:
我看过http://reactivex.io/documentation/operators.html#combining,但没有一个符合我的要求。
答案 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
,然后将其过滤掉。可能有更优雅的方式来做到这一点,但我无法想到一个。