我该如何组成一个像replay
这样的运算符来重播与谓词匹配的最后一个项目,然后重播所有所有个将来的项目?
例如,如果一个热的可观察对象发出A, B, C, D, E, F
并且我的谓词与元音匹配,则在C
和D
之间加入的订户应该收到A, D, E, F
。
答案 0 :(得分:0)
我只是个鸡蛋,但这是我想出的要重播单个项目的东西:
public static <T> Observable<T> replay(final Observable<T> observable,
final Predicate<? super T> predicate) {
final AtomicReference<T> mLastMatch = new AtomicReference<>();
return observable.map(e -> {
if (predicate.test(e)) {
mLastMatch.set(e);
}
return e;
})
.startWith(Observable.defer(() -> {
final T t = mLastMatch.get();
return t == null ? Observable.empty() : Observable.just(t);
}));
}