java - 简化交错的 flatMap Observables 链

标签 java rx-java

我想从我的存储库中检索对象列表,然后在实际有机会使用检索到的列表之前清除我的存储库的内容。目前,我有几个交错的平面 map ,但我想有更好的方法来做到这一点。这就是我的 Observables 链的样子:

mQueuedCallsRepository.getAll()
    .flatMap(new Func1<QueuedCallModel[], Observable<QueuedCallModel[]>>() {
        @Override
        public Observable<QueuedCallModel[]> call(final QueuedCallModel[] queuedCallModels) {
            return mQueuedCallsRepository.clear()
                    .doOnNext(new Action1<Void>() {
                        @Override
                        public void call(Void aVoid) {
                            disableReceiver(context);
                        }
                    })
                    .flatMap(new Func1<Void, Observable<QueuedCallModel[]>>() {
                        @Override
                        public Observable<QueuedCallModel[]> call(Void aVoid) {
                            return Observable.just(queuedCallModels);
                        }
                    });
        }
    })
    .subscribeOn(Schedulers.io());

有什么想法可以简化它吗?

最佳答案

你的代码很好。唯一的优化是内部 flatMap,它可以只是一个 map

mQueuedCallsRepository.getAll()
    .subscribeOn(Schedulers.io())
    .flatMap(queuedCallModels -> {
            return mQueuedCallsRepository.clear()
                    .doOnNext(aVoid -> disableReceiver(context))
                    .map( aVoid -> queuedCallModels);
    });

逻辑如下:

  • 获取所有数据并在IO线程中运行操作
  • 当你清楚数据时(他们)
  • 清除操作成功后禁用接收器
  • 然后返回之前获取的所有数据

关于java - 简化交错的 flatMap Observables 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35343464/

相关文章:

java - 尽管有 Import-Package,但 org.osgi.framework.BundleActivator 的 ClassNotFoundException

Java:如何有效地从数据库中读取?

java - 如何在 Android 中使用共享首选项?

android - 订户 OnComplete 调用了两次

android - Bitmap 下载期间出现 UndeliverableException : RxJava

android - 在 RxJava 中取消订阅 rx.Single

java - 如何在时间间隔内使用自定义类作为 Observable 和 fire 方法

java - 安全出版

java - 如何编写发送电子邮件或传真的接口(interface)

android - 如何在最后一个订阅者退订后延迟拆除共享的、无限的 Observables