我有Observable<MoviesResponse>
。我的MovieResponse
类包含getResults()
个返回List<Result>
的方法。此Result类具有返回String的getTitle()
方法。我想调用所有getTitle()
个对象的Result
方法来获取所有电影的标题。
我使用foreach循环使用下面的代码实现了这一点,但我认为通过链接RxJava运算符有更好的方法来实现这一点,我只是无法弄清楚...
订阅:
Observable<MoviesResponse> moviesResponseObservable = apiService.getTopRatedMoviesObservable(API_KEY);
subscription = moviesResponseObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MoviesResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MoviesResponse moviesResponse) {
List<Result> results = moviesResponse.getResults();
for (Result r:results) {
Log.d(LOG_TAG,r.getTitle());
}
}
});
界面:
public interface ApiService {
@GET("movie/top_rated")
Observable<MoviesResponse> getTopRatedMoviesObservable(@Query("api_key") String apiKey);
}
答案 0 :(得分:3)
您可以使用flatmap将观察结果转换为Observable<Result>
,然后使用map将其转换为Observable<String>
,然后您可以订阅。{/ p>
moviesReponseObservable
.subscribeOn(Schedulers.io())
.flatMapIterable(new Function<MoviesResponse, Iterable<Result>>() {
@Override
public Iterable<Result> apply(@NonNull MoviesResponse moviesResponse) throws Exception {
return moviesResponse.getResults();
}
})
.map(new Function<Result, String>() {
@Override
public String apply(@NonNull Result result) throws Exception {
return result.getTitle();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
Log.d("TAG", s);
}
/* ... */
});
答案 1 :(得分:1)
我在@ zsmb13回答中遇到以下错误:
new function:map(rx.functions.Func1)in Observable不适用于(匿名 java.util.function.Function)reaso N: 没有类型变量R的实例存在,因此Function符合Func1
无论如何,这个答案非常有用,我刚刚用Function
替换了Func1
并使用了call
方法。
subscription = moviesResponseObservable
.subscribeOn(Schedulers.io())
.flatMapIterable(new Func1<MoviesResponse, Iterable<Result>>() {
@Override
public Iterable<Result> call(MoviesResponse moviesResponse) {
return moviesResponse.getResults();
}
})
.map(new Func1<Result, String>() {
@Override
public String call(Result result) {
return result.getTitle();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.d(LOG_TAG, s);
}
});