RX+Retrofit 从服务器响应过滤数据

RX+Retrofit filtring data from server Response

如何在特定条件下使用 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());
                }
            });

i have response like

{ "schoolList": [
 {
  "name": "A University",

    "id": "168"
 },
 {
  "name": "Alba Sciences",
  "id": "271"
 },
 {
  "name": "B University",

    "id": "168"
 }]
}

i have try this way but getting noting in (On Next)

 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());
                }
            });

我认为你应该能够使用类似下面的东西(强烈建议在使用 RxJava 时使用 RetroLambda(或准备好 Jack))

    api.school()
            .flatMapIterable(schoolResponse -> schoolResponse.getSchoolList())
            .filter(school -> school.getId().equals("168"))
            .toList()

使用 FlatMap Operator 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
        }
    });