本文中经过图解的方式解释Rxjava中复杂的操做符,值得收藏。其中用到的demo地址:RxJava2-Android-Samplesjavascript
Observable<List<String>> buffered = getObservable().buffer(2, 3);
图示中就是每次buffer 2个数据以后emit,每次emit以后跳过3个数据。html
Observable.concat(aObservable, bObservable)
demo:getObservable() .debounce(500, TimeUnit.MILLISECONDS)
第一个参数是时间间隔
第二个参数是时间单位
debounce表示emit数据以后必定时间内没有其余数据出现才真正emit数据。
图示中emit黄球后,在规定时间内又emit绿球,则黄球不会被emit。java
defer为每个observer建立一个ObservableSource,这样当第一个observer订阅以后若是ObservableSource中的数据发生变化,第二个订阅的Observer会获得不一样的数据。react
demo:git
Observable.defer(new Callable<ObservableSource<? extends String>>() {
@Override
public ObservableSource<? extends String> call() throws Exception {
return Observable.just(brand);
}
});复制代码
demo中能够随时改变brand
的值,这样不一样的Observer可能会获得不一样的值。github
distinct能够对 emit 的数据作去重处理
demo:api
Observable.just(1, 2, 1, 1, 2, 3, 4 ,6, 4)
.distinct()
.subscribe(getObserver());复制代码
demo中最后emit的数据只有1,2,3,4,6缓存
filter按照必定的规则过滤数据
demo:app
Observable.just(1, 2, 3, 4, 5, 6)
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
return integer % 2 == 0;
}
})
.subscribe(getObserver());复制代码
demo中原始数据中奇数会被过滤掉。ide
Flowable<Integer> observable = Flowable.just(1, 2, 3, 4);
observable.reduce(50, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer t1, Integer t2) {
return t1 + t2;
}
}).subscribe(getObserver());复制代码
demo中把 50 + 1 +2 +3 +4 的结果60 emit。
Observable.interval(0, 2, TimeUnit.SECONDS);
若是Observable有数据则只emit最后一个数据,若是没有数据则emit默认数据。
demo:
Observable.just("A1", "A2", "A3", "A4", "A5", "A6").last("A1") // the default item ("A1") to emit if the source ObservableSource is empty
.subscribe(getObserver());复制代码
demo中只emit A6,若是Observable没有数据,则会emit 默认数据A1。
getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<List<ApiUser>, List<User>>() {
@Override
public List<User> apply(List<ApiUser> apiUsers) throws Exception {
return Utils.convertApiUserListToUserList(apiUsers);
}
})
.subscribe(getObserver());复制代码
demo中把一个ApiUser list转为 User list 了。
merge 与concat不一样的是把两个 Observable的数据合成一列数据,就像是从一个Observable emit,可是顺序不必定。
demo:
final String[] aStrings = {"A1", "A2", "A3", "A4"};
final String[] bStrings = {"B1", "B2", "B3"};
final Observable<String> aObservable = Observable.fromArray(aStrings);
final Observable<String> bObservable = Observable.fromArray(bStrings);
Observable.merge(aObservable, bObservable)
.subscribe(getObserver());复制代码
demo 中最终emit的数据多是"A1", "B1", "A2", "A3", "A4", "B2", "B3",还多是其余顺序。
demo:
Observable.just(1, 2, 3, 4, 5)
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.scan(new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer int1, Integer int2) throws Exception {
return int1 + int2;
}
})
.subscribe(getObserver());复制代码
demo中依次输出1,3,6,10,15,即依次把BiFunction做用在前一个输出结果和当前数据上。
demo:
Observable.just(1, 2, 3, 4, 5)
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.skip(3)
.subscribe(getObserver());复制代码
skip比较简单,会跳过前几个数据,具体能够经过参数设置,demo中是跳过前三个数据。
Observable.just(1, 2, 3, 4, 5)
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.take(3)
.subscribe(getObserver());复制代码
take比较简单,只取前几个数据emit,demo中取前三个数据。
demo:
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
// send events with simulated time wait
Thread.sleep(0);
emitter.onNext(1); // skip
emitter.onNext(2); // deliver
Thread.sleep(505);
emitter.onNext(3); // skip
Thread.sleep(99);
emitter.onNext(4); // skip
Thread.sleep(100);
emitter.onNext(5); // skip
emitter.onNext(6); // deliver
Thread.sleep(305);
emitter.onNext(7); // deliver
Thread.sleep(510);
emitter.onComplete();
}
}).throttleLast(500, TimeUnit.MILLISECONDS)
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver());复制代码
demo中每隔500ms emit当时的最后一个数据,demo中最终emit 2,6,7。
timer比较简单,就是延时必定时间emit 数据0。
demo:
Observable.timer(2, TimeUnit.SECONDS)
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver());复制代码
private void doSomeWork() {
Observable.zip(getCricketFansObservable(), getFootballFansObservable(),
new BiFunction<List<User>, List<User>, List<User>>() {
@Override
public List<User> apply(List<User> cricketFans, List<User> footballFans) throws Exception {
return Utils.filterUserWhoLovesBoth(cricketFans, footballFans);
}
})
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver());
}
private Observable<List<User>> getCricketFansObservable() {
return Observable.create(new ObservableOnSubscribe<List<User>>() {
@Override
public void subscribe(ObservableEmitter<List<User>> e) throws Exception {
if (!e.isDisposed()) {
e.onNext(Utils.getUserListWhoLovesCricket());
e.onComplete();
}
}
});
}
private Observable<List<User>> getFootballFansObservable() {
return Observable.create(new ObservableOnSubscribe<List<User>>() {
@Override
public void subscribe(ObservableEmitter<List<User>> e) throws Exception {
if (!e.isDisposed()) {
e.onNext(Utils.getUserListWhoLovesFootball());
e.onComplete();
}
}
});
}
public static List<User> filterUserWhoLovesBoth(List<User> cricketFans, List<User> footballFans) {
List<User> userWhoLovesBoth = new ArrayList<User>();
for (User cricketFan : cricketFans) {
for (User footballFan : footballFans) {
if (cricketFan.id == footballFan.id) {
userWhoLovesBoth.add(cricketFan);
}
}
}
return userWhoLovesBoth;
}复制代码
zip对两个Observable的数据进行BiFunction操做,以后再emit出去。demo中getCricketFansObservable 获取到喜欢cricket 的人,getFootballFansObservable获取到喜欢football的人,最终通过BiFunction以后获取到喜欢两项运动的人。
关于Rxjava的更多operators能够参考其官网,地址:reactivex.io/documentati…