Observable.just(1, 2, 3, 4).skip(1).subscribe(System.out::println);
输出2,3,4
skip操作符的含义就是跳过指定数量的事件,忽略前面的事件,看看源码里是怎么写的吧
public final Observable skip(long count) {
if (count <= 0) {
return RxJavaPlugins.onAssembly(this);
}
return RxJavaPlugins.onAssembly(new ObservableSkip(this, count));
}
追踪到ObservableSkip类里看看
public final class ObservableSkip extends AbstractObservableWithUpstream {
final long n;
public ObservableSkip(ObservableSource source, long n) {
super(source);
this.n = n;
}
@Override
public void subscribeActual(Observer super T> observer) {
source.subscribe(new SkipObserver(observer, n));
}
...
当我们调用subscribe时,就会触发subscribeActual函数的调用
这里的source就是我们代码里Observable.just(1, 2, 3, 4)返回的ObservableFromArray对象,看的出,实际上就是在中间又加了一个观察者(SkipObserver),当ObservableFromArray对象调用subscribe时,就会触发SkipObserver对象的onSubscribe方法,在这个方法里this.upstream就是FromArrayDisposable对象,先别管这个是什么,主要看事件流是怎么发送到观察者的。
public void onSubscribe(Disposable d) {
if (DisposableHelper.validate(this.upstream, d)) {
this.upstream = d;
downstream.onSubscribe(this);
}
}
好了,开始发送事件onNext,是谁在发送事件?,其实就是一直都是观察者在发送,因为这里有个SkipObserver,事件先由它发出来,经过onNext,
属性remaining表示还需要逃过多少事件,一直到remaining为0,事件就会交给下游downstream处理。
@Override
public void onNext(T t) {
if (remaining != 0L) {
remaining--;
} else {
downstream.onNext(t);
}
}
基于源码2.2.4版本