2016-11-30 5 views
1

как использовать RxJava Function .filter() для конкретного состояния, я хочу только лишь данных, идентификатор 168, это правильный способ сделать или придется изменить свой код стиль дайте мне ваше ценное предложение. (Без использования RetroLambda :))RX + ДООСНАСТКА filtring данные серверов Response

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" 
}] 
} 

я есть попробовать этот способ, но получить отмечая в (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()); 
       } 
      }); 
+0

проверить мой [ответ] (HTTP : //stackoverflow.com/a/40887006/3629732) –

ответ

0

Я думаю, вы должны быть в состоянии t о использовать что-то вроде следующего (настоятельно рекомендуется использовать RetroLambda (или Джека, когда он будет готов) при использовании RxJava)

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

Thanx Johan за ваш быстрый ответ, да, я читал об этом, просто работая над RetroLambda, но сейчас у меня такой сценарий, как я описал в своем вопросе. – Drim

+0

пример, который я привел выше, должен по-прежнему работать над проблемой, которую вы описали без использования RetroLambda .... это просто заставляет ее выглядеть красивее :) –

+0

да, это так, спасибо, у вас есть пример для Retrolambda и Rx java mix this one бит закручен для нового ученика – Drim

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 
     } 
    }); 
+0

Thanx для ответа, для быстрого исправления i переключитесь на RetroLambda, извините, не смог проверить этот, я проверю этот позже, – Drim

+0

@Drim Ok Choice - ваш –