RxJava 2 воспроизводит последний предикат соответствия элемента? - PullRequest
0 голосов
/ 29 августа 2018

Как мне составить оператор, такой как replay, который воспроизводит последний элемент (ы), соответствующий предикату, а затем все будущие элементы?

Например, если горячая наблюдаемая издает A, B, C, D, E, F и мой предикат соответствует гласным, то подписчик, присоединяющийся между C и D, должен получить A, D, E, F.

1 Ответ

0 голосов
/ 29 августа 2018

Я всего лишь яйцо, но вот что я придумал, чтобы воспроизвести один предмет:

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