更好地使用RxJava

  • 本文关键字:RxJava 更好 rx-java
  • 更新时间 :
  • 英文 :


我仍在学习RxJava,我想知道是否有其他方法可以做我想做的事情。

我有以下代码,它可以工作:

apiManager.getChannelListByRegion(region)
            .observeOn(scheduler)
            .map(new Func1<ChannelList, List<ChannelList.Channel>>() {
                @Override
                public List<ChannelList.Channel> call(ChannelList channelList) {
                    if (params.getGenre() == 0) {
                        return channelList.getChannels();
                    } else {
                        List<ChannelList.Channel> filteredList = new ArrayList<>();
                        for (ChannelList.Channel channel : channelList.getChannels()) {
                            if (Integer.parseInt(channel.getGenreId()) == params.getGenre())
                                filteredList.add(channel);
                        }
                        return filteredList;
                    }
                }
            })
            .subscribe(new SuccessCallback<>(callback), new ErrorCallback(callback));

一些解释——ChannelList是一个POJO,代表来自外部服务的一些JSon。我无法控制这个JSon的结构。

ChannelList包含一个我想要的嵌入列表,假设不过滤列表,我可以很容易地通过map()操作符获得它。

然而,如果我需要过滤,我会对其内容进行循环,并检查过滤条件。

有没有更好的过滤方法?我假设我需要创建另一个Observable,它会发出List内容并提供一个函数,但我不确定如何做到这一点。

我可以向您展示如何仅使用FP和reactivex重写代码。如果它更简单,那就相当于品味问题了。我将使用lambdas来使代码更易于理解。

apiManager.getChannelListByRegion(region)
                .observeOn(scheduler)
                .flatMap(channelList->Observable.from(channelList.getChannels()))
                .filter(channel->params.getGenre() == 0 || Integer.parseInt(channel.getGenreId()) == params.getGenre())
                .toList()
                .subscribe(new SuccessCallback<>(callback), new ErrorCallback(callback));

正如您所看到的,我首先将ChannelList转换为Observable of Channel,然后对其进行过滤并收集为列表。

最新更新