我刚刚开始使用RxJava并尝试一个示例项目。
我想要实现的是
- >获取对象 - > 其中包含子对象列表 - >检查子列表是否满足谓词条件 - >如果满足
则发出子对象这是我的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
说给我的电影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() {
}
}));
}
然而,它没有编译。 Cleary我不知道该怎么做,感谢任何帮助
答案 0 :(得分:2)
它不编译的原因是因为你正在返回一个observable并且你的函数签名期望迭代:
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");
}
})...
答案 1 :(得分:1)
我不知道它是否正是你要做的,而是取代
return Observable.fromIterable(upComingMovies.getResults());
与
return upComingMovies.getResults();
如果你想要你的项目编译
答案 2 :(得分:0)
如果我正确理解了您的代码,您会得到一个UpcomingMovies
类型的结果(这就是为什么您应该在此使用Single
而不是Observable
),然后将其展平为多个排放类型为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());
});