Я использую RxJava, и мне нужно сделать 2 вещи:
- Получить последний элемент, испускаемый из
Observable
- Определите, был ли вызван
onError
илиonCompleted
Я рассматривал использование last
и lastOrDefault
(на самом деле это то поведение, которое мне нужно), но мне не удалось обойти onError
, скрывающий последний элемент. Я был бы в порядке, если бы Observable использовался дважды, один раз для получения значения last
и один раз для получения статуса завершения, но до сих пор я смог сделать это, только создав свой собственный Observer
:
public class CacheLastObserver<T> implements Observer<T> {
private final AtomicReference<T> lastMessageReceived = new AtomicReference<>();
private final AtomicReference<Throwable> error = new AtomicReference<>();
@Override
public void onCompleted() {
// Do nothing
}
@Override
public void onError(Throwable e) {
error.set(e);
}
@Override
public void onNext(T message) {
lastMessageReceived.set(message);
}
public Optional<T> getLastMessageReceived() {
return Optional.ofNullable(lastMessageReceived.get());
}
public Optional<Throwable> getError() {
return Optional.ofNullable(error.get());
}
}
У меня нет проблем с созданием собственного Observer
, но мне кажется, что Rx должен лучше соответствовать этому варианту использования «получить последний элемент, испускаемый до завершения». Любые идеи о том, как это сделать?