【问题标题】:flatMap() in RxJavaRxJava 中的 flatMap()
【发布时间】:2017-09-24 05:55:51
【问题描述】:

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

但是,它不能编译。 显然我不知道该怎么做,感谢任何帮助

【问题讨论】:

  • 你只需要return upComingMovies.getResults().iterator(),不是吗?
  • 需要可迭代而不是迭代器,另一种方法可能是使用映射和变换到电影并在那里添加过滤器?关于如何做到这一点的任何想法?
  • 类似的想法。只需返回结果列表
  • getResults()ListListIterable

标签: android rx-java rx-java2


【解决方案1】:

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

您似乎想将 UpcomingMovies 映射到 Movies

的 List / Iterable

为了做到这一点,尝试从这个函数定义开始

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) 

【讨论】:

  • 这个能不能详细点,我好像没看懂
  • Iterable&lt;Movies&gt;替换Iterable&lt;UpComingMovies&gt;
  • 就像我说的,只返回列表。任何集合都是可迭代的,而不是迭代器
  • @cricket_007 flatMapIterable 正是为了避免必须从 Iterables 显式创建 Observables。而是可以直接使用getResult()
  • 确实存在。 github.com/ReactiveX/RxJava/wiki/Creating-Observables 也许我在冲突 RxJava1
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 2015-03-26
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多