从Observable获取数组的值

时间:2017-03-28 03:47:29

标签: java android rx-java reactive-programming rx-android

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

2 个答案:

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