2017-09-25 55 views
2

我剛剛開始使用RxJava並嘗試一個示例項目。在RxJava2中使用flatMapIterable()

我試圖做到的,是

- >獲取一個對象 - > 其中包含的子對象的列表 - >檢查子列表滿足謂詞條件 - >併發出子-objects如果滿足

這是我的POJO

public class UpComingMovies { 

@SerializedName("results") 
    private List<Movies> results; 
} 

public class Movies { 

@SerializedName("overview") 
    private String overview; 

@SerializedName("original_language") 
    private String originalLanguage; 
} 

所以,從我的理解是,我可以用flatMapIterable和改造項目到多個觀測,然後用filter說給我的電影WHI CH有originalLanguage.equals("en")

這就是我試圖做

@GET("movie/upcoming") 
Observable<UpComingMovies> getUpComingMovies(@Query("api_key") String apiKey, @Query("page") String page); 

private final CompositeDisposable disposables = new CompositeDisposable(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    disposables.add(RetrofitConnection.getService() 
      .getUpComingMovies(Config.API_KEY, "1") 
      .flatMapIterable(new Function<UpComingMovies, Iterable<Movies>>() { 
       @Override 
       public Iterable<Movies> apply(@NonNull UpComingMovies upComingMovies) throws Exception { 
        // no instance(s) of the type variable(s) U exist so that the Observable<U> conforms to a disposable 
        return upComingMovies.getResults(); 
       } 
      }) 
      .filter(movies -> movies.getVoteCount() > 200).subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new DisposableObserver<Movies>() { 
       @Override 
       public void onNext(@NonNull Movies movies) { 

       } 

       @Override 
       public void onError(@NonNull Throwable e) { 

       } 

       @Override 
       public void onComplete() { 

       } 
      })); 
} 

但是,它不能編譯。 克利裏我不知道如何做到這一點,任何幫助表示讚賞

回答

2

它不會編譯的原因是因爲你返回一個可觀察到的和你的函數簽名期待一個迭代:

new Function<UpComingMovies, Iterable<Movies>>() { 
    @Override 
    public Iterable<Movies> apply(@NonNull UpComingMovies upComingMovies) throws Exception { 
     // List<Movies> is iterable 
     return upComingMovies.getResults(); 

    } 
} 

如果你修復它這樣,那麼你可以做

...flatMapIterable(...) 
    .filter(new Predicate<Movies>() { 
     @Override 
     public boolean test(Movies movies) throws Exception { 
       return movies.originalLanguage.equals("en"); 
     } 
    })... 
+0

我收到一個錯誤消息 - 沒有存在類型變量U的實例,因此Observable 符合一次性 –

+0

'.getUpComingMovies(Config.API_KEY,「1」 )' '.flatMapIterable(UpComingMovies :: getResults)' '.filter(movies - > movies.originalLanguage.equals(「en」))' 這個爲我編譯。 – Jon

+0

是的,它的工作。謝謝 –

0

如果我理解正確你的代碼,你會得到UpcomingMovies類型的一個結果(這就是爲什麼你應該在這裏,而不是Observable使用Single),然後壓平那種類型爲Movies的多種排放物。這就是爲什麼你的subscribe功能不起作用:它預計UpcomingMovies,但得到Movies

像這樣的東西可能是你想要什麼:

@GET("movie/upcoming") 
Single<UpComingMovies> getUpComingMovies(@Query("api_key") String apiKey, @Query("page") String page); 

RetrofitConnection.getService() 
      .getUpComingMovies(Config.API_KEY, "1") 
      .flatMapIterable((UpComingMovies upComingMovies) -> { 
       return upComingMovies.getResults(); 
      }) 
      .filter((Movies movie) -> { 
       return movie.originalLanguage.equals("en"); 
      }) 
      .subscribe((Movies movie) -> { 
       Log.d("", movie.toString()); 
      }); 
+0

是的,這是我在做什麼什麼。既然你知道我想要做什麼,你能建議任何替代品嗎? –

2

我不知道它是你正在試圖做的,但與

return upComingMovies.getResults(); 

更換

return Observable.fromIterable(upComingMovies.getResults()); 

,如果你想你的項目編譯

+0

我試過並得到這個錯誤 - 沒有任何類型變量U的實例存在,所以Observable 符合一次性 –