這篇英遭,我們講幾個(gè)條件判斷和布爾值操作相關(guān)的操作符延届。
All操作符。判定是否Observable發(fā)射的所有數(shù)據(jù)都滿足某個(gè)條件跟伏。就是判斷某個(gè)數(shù)據(jù)源發(fā)射的數(shù)據(jù)是否符合規(guī)則,然后輸出一個(gè)Boolean類(lèi)型的返回值翩瓜。(這里有小伙伴就會(huì)問(wèn)了受扳,這效果和filter不是一樣的嗎?其實(shí)的確是一樣的兔跌,只是filter不會(huì)改變上游的數(shù)據(jù)類(lèi)型勘高,而all操作符則強(qiáng)制輸出類(lèi)型為Boolean值類(lèi)型,所以使用all還是filter坟桅,看場(chǎng)景华望。)
image.png
- 例如,在一個(gè)問(wèn)題列表中仅乓,點(diǎn)擊條目赖舟,跳轉(zhuǎn)到聊天室,自動(dòng)發(fā)送多條問(wèn)題消息夸楣。(有點(diǎn)像京東宾抓、天貓找客服,自動(dòng)發(fā)一些確定的問(wèn)題)
/**
* 自動(dòng)批量發(fā)送消息
*/
public Observable<Boolean> autoSendMsgList(ArrayList<AutoSendMsgModel> autoSendMsgList) {
return Observable.fromIterable(autoSendMsgList)
.flatMap(new Function<AutoSendMsgModel, ObservableSource<Boolean>>() {
@Override
public ObservableSource<Boolean> apply(AutoSendMsgModel model) throws Exception {
return sendTextMsg(model.getMsg());
}
})
.all(new Predicate<Boolean>() {
@Override
public boolean test(Boolean isSuccess) throws Exception {
return isSuccess;
}
}).toObservable();
}
- all操作符豫喧,判定每次發(fā)送的消息的返回結(jié)果都要為true石洗,才算發(fā)送成功。
Amb操作符紧显。給定兩個(gè)或多個(gè)Observables讲衫,它只發(fā)射首先發(fā)射數(shù)據(jù)或通知的那個(gè)Observable的所有數(shù)據(jù),其他被拋棄孵班。意思就是競(jìng)爭(zhēng)涉兽,誰(shuí)先發(fā)送事件招驴,誰(shuí)就贏。不管是onNext()花椭,還是onError或onCompleted()事件忽匈。
image.png
- 這個(gè)場(chǎng)景就很好理解了,例如我們請(qǐng)求接口前矿辽,先去找內(nèi)存緩存,再找本地緩存郭厌,最后沒(méi)有緩存可用袋倔,就請(qǐng)求接口數(shù)據(jù),如果有緩存折柠,那接口就不請(qǐng)求了宾娜。
Observable.ambArray(
Observable.create(new ObservableOnSubscribe<List<SearchTagModel>>() {
@Override
public void subscribe(ObservableEmitter<List<SearchTagModel>> emitter) throws Exception {
if (mHotTagCacheList.size() > 0) {
emitter.onNext(mHotTagCacheList);
emitter.onComplete();
}
}
})
.map(new Function<List<SearchTagModel>, BaseSearchModel>() {
@Override
public BaseSearchModel apply(List<SearchTagModel> tagModels) throws Exception {
mHotTagList.clear();
mHotTagList.addAll(tagModels);
return new HotSearchModel(tagModels);
}
}),
//熱門(mén)搜索
mClient.requestTagsInObservable(TAG)
.filter(new Predicate<HttpModel<List<SearchTagModel>>>() {
@Override
public boolean test(HttpModel<List<SearchTagModel>> httpModel) throws Exception {
return httpModel.getData() != null && httpModel.getData().size() > 0;
}
})
.map(new Function<HttpModel<List<SearchTagModel>>, BaseSearchModel>() {
@Override
public BaseSearchModel apply(HttpModel<List<SearchTagModel>> httpModel) throws Exception {
//緩存
mHotTagCacheList.clear();
mHotTagCacheList.addAll(httpModel.getData());
mHotTagList.clear();
mHotTagList.addAll(httpModel.getData());
return new HotSearchModel(httpModel.getData());
}
}))
- 例如搜索功能,熱門(mén)搜索扇售,如果之前在前面一個(gè)界面已經(jīng)請(qǐng)求過(guò)了前塔,則可以直接帶數(shù)據(jù)過(guò)來(lái),直接使用承冰,不再調(diào)接口拿华弓。再或者前面沒(méi)有請(qǐng)求過(guò),沒(méi)有緩存困乒,則請(qǐng)求接口寂屏,再將數(shù)據(jù)緩存到集合(內(nèi)存緩存)。
Contains操作符娜搂。判定一個(gè)Observable是否發(fā)射一個(gè)特定的值迁霎,并返回一個(gè)Boolean結(jié)果值。效果就是List集合.contains(object)的效果百宇,判斷某個(gè)值是否存在集合中考廉,在RxJava中,Contains操作符就是判斷某個(gè)數(shù)據(jù)集是否發(fā)出過(guò)指定的事件值携御。
image.png
- 例如昌粤,遍歷列表數(shù)據(jù)集,判斷是否存在某個(gè)類(lèi)型的條目因痛,存在或不存在做某些操作婚苹。
Object model = ...
Items items = new Items();
Observable.fromIterable(items)
.contains(model)
.as(RxLifecycleUtil.bindLifecycle(this))
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean isContains) throws Exception {
//...
}
});