RxJava中的flatMap()

时间:2017-09-24 05:55:51

标签: android rx-java rx-java2

我刚刚开始使用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;
}

所以,根据我的理解,我可以使用flatMap并将项目转换为多个可观察对象,然后使用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 {
                    // does not compile - needs an iterable
                    return upComingMovies.getResults().iterator();
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableObserver<UpComingMovies>() {
                @Override
                public void onNext(UpComingMovies upComingMovies) {
                    Log.d(getClass().getName(), upComingMovies.toString());
                }

                @Override
                public void onError(Throwable e) {
                    Log.d(getClass().getName(), e.getMessage());
                }

                @Override
                public void onComplete() {
                    Log.d(getClass().getSimpleName(), "onComplete");
                }
            }));
}

然而,它没有编译。 Cleary我不知道该怎么做,感谢任何帮助

1 个答案:

答案 0 :(得分:0)

您的过滤器不应该编译,因为之前的函数生成了一个可迭代的UpcomingMovies。换句话说,该过滤器期望可观察到电影,但之前的功能是映射到UpcomingMovies的可迭代

您似乎想要将UpcomingMovies映射到电影的列表/可转换

为此,请尝试从此功能定义

开始
flatMapIterable(new Function<UpComingMovies, Iterable<Movies>>()

然后,您可以使用UpcomingMovies对象参数的getResults()来获取子列表,返回它,然后将其传递给后续的过滤操作

在代码中,

.flatMapIterable(new Function<UpComingMovies, Iterable<Movies>>() {
    @Override
    public Iterable<Movies> call(UpComingMovies upcomingMovies) {
        return upcomingMovies.getResults();
    }
})

此外,如果您使用lambdas启用Java 8编译,那么代码更简单...减少到一行

.flatMapIterable(UpComingMovies::getResults)