2017-09-25 53 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 符合一次性 –