来自服务器响应的RX + Retrofit filtring数据

时间:2016-11-30 10:19:10

标签: android function filter retrofit rx-java2

如何使用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());
                }
            });

2 个答案:

答案 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
        }
    });