从 Observable 获取数组的值

Get values of an Array from an Observable

我有一个 Observable<MoviesResponse>。我的 MovieResponse class 包含一个 getResults() 方法返回一个 List<Result>。此结果 class 有一个 getTitle() 方法返回一个字符串。我想调用我所有 Result objects 的 getTitle() 方法来获取我所有电影的标题。

我通过下面的代码使用 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);
}

您可以使用 flatmap to transform your observable into an Observable<Result> and then use map 将其转换为 Observable<String>,然后您可以订阅它。

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

        /* ... */    

    });

@zsmb13 的回答出现以下错误:

new Function : map (rx.functions.Func1) in Observable cannot be applied to (anonymous java.util.function.Function)reaso‌​n: no instance(s) of type variable(s) R exist so that Function conforms to Func1

无论如何,这个答案很有帮助我只是用 Func1 替换了 Function 并使用了 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);
                    }
                });