defaultIfEmpty操作符的作用就是如果生产者没有发送数据,就会给出默认数据。
Observable.empty().defaultIfEmpty("empty").subscribe(new Observer<Object>() {
@Override
public void onSubscribe(@NotNull Disposable d) {
System.out.println("onSubscribe ");
}
@Override
public void onNext(@NotNull Object s) {
System.out.println("onNext " + s);
}
@Override
public void onError(@NotNull Throwable e) {
System.out.println("onError " + e.getMessage());
}
@Override
public void onComplete() {
System.out.println("onComplete ");
}
});
看看源码
很简单,empty标识是否是空数据,如果生产者没有生产数据,就会调用onComplete方法,继续就会调用 other.subscribe(this);,这个other就是我们defaultIfEmpty创造出来的新生产者,就会把默认数据发送到下游。
public final class ObservableSwitchIfEmpty<T> extends AbstractObservableWithUpstream<T, T> {
final ObservableSource<? extends T> other;
public ObservableSwitchIfEmpty(ObservableSource<T> source, ObservableSource<? extends T> other) {
super(source);
this.other = other;
}
@Override
public void subscribeActual(Observer<? super T> t) {
SwitchIfEmptyObserver<T> parent = new SwitchIfEmptyObserver<T>(t, other);
t.onSubscribe(parent.arbiter);
source.subscribe(parent);
}
static final class SwitchIfEmptyObserver<T> implements Observer<T> {
final Observer<? super T> downstream;
final ObservableSource<? extends T> other;
final SequentialDisposable arbiter;
boolean empty;
SwitchIfEmptyObserver(Observer<? super T> actual, ObservableSource<? extends T> other) {
this.downstream = actual;
this.other = other;
this.empty = true;
this.arbiter = new SequentialDisposable();
}
@Override
public void onSubscribe(Disposable d) {
arbiter.update(d);
}
@Override
public void onNext(T t) {
if (empty) {
empty = false;
}
downstream.onNext(t);
}
@Override
public void onError(Throwable t) {
downstream.onError(t);
}
@Override
public void onComplete() {
if (empty) {
empty = false;
other.subscribe(this);
} else {
downstream.onComplete();
}
}
}
}