如何使用RxJava函数.filter()来处理特定情况,我想要 只有id为168的数据, 这是做或不得不改变我的代码风格的正确方法给我你宝贵的建议。 (没有RetroLambda使用:))
NetworkRequest networkRequest = new NetworkRequest(this);
RestApi api = networkRequest.getInstance().create(RestApi.class);
subscription = api
.school()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<SchoolList>>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: completed");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: on Error");
e.printStackTrace();
}
@Override
public void onNext(Response<SchoolList> schoolResponse) {
Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size());
}
});
我有回应
{ "schoolList": [
{
"name": "A University",
"id": "168"
},
{
"name": "Alba Sciences",
"id": "271"
},
{
"name": "B University",
"id": "168"
}]
}
我试过这种方式但是注意到(下一步)
NetworkRequest networkRequest = new NetworkRequest(this);
RestApi api = networkRequest.getInstance().create(RestApi.class);
subscription = api
.school()
.filter(new Func1<Response<SchoolList>, Boolean>() {
@Override
public Boolean call(Response<SchoolList> schoolListResponse) {
Log.d(TAG, "condition: computing 2");
return schoolListResponse.getSchoolList().get(0).getId().equals("168");
}
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<SchoolList>>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: completed");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: on Error");
e.printStackTrace();
}
@Override
public void onNext(Response<SchoolList> schoolResponse) {
Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size());
}
});
答案 0 :(得分:0)
我认为你应该可以使用类似的东西(强烈建议在使用RxJava时使用RetroLambda(或者当它准备就绪时使用Jack)
api.school()
.flatMapIterable(schoolResponse -> schoolResponse.getSchoolList())
.filter(school -> school.getId().equals("168"))
.toList()
答案 1 :(得分:0)
请参阅FlatMap操作员schoolItem您选择的项目
api.school().flatMap(new Func1<SchoolListResponse, Observable<SchoolItem>>() {
@Override
public Observable<SchoolItem> call(SchoolListResponse schoolListResponse) {
return Observable.from(schoolListResponse.getSchoolList());
}
}).filter(new Func1<SchoolItem, Boolean>() {
@Override
public Boolean call(SchoolItem schoolItem) {
return schoolItem.getId().equals("168");
}
}).subscribe(new Subscriber<SchoolItem>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(SchoolItem schoolItem ) {
//schoolItem Filtered Item
}
});