【问题标题】:FlatMapIterable truncationFlatMapIterable 截断
【发布时间】:2021-04-18 22:40:12
【问题描述】:

我希望将项目列表映射到可观察对象,然后将每个可观察项目平面映射到另一个函数来处理它,以将某些 REST API 调用的结果保存到数据库中。

API 调用正确返回所有项目。但是,flatMapIterable 不会将所有项目传递给最后一个 flatMap。

这里是代码。

restApi.getContacts(user)
        .flatMapIterable(new Func1<List<Contact>, List<Contact>>() {
            @Override
            public List<Contact> call(List<Contact> contacts) {
                return contacts;
            }
        }

        .flatMap(new Func1<Contact, Observable<Integer>>() {
            @Override
            public Observable<Integer> call(Contact Contact) {
                return create(Contact);
            }
        })

我不想使用 doOnEach 或 doOnNext,我的问题是关于 flatMapIterable 的行为。

任何想法为什么我无法到达最后一个平面图中的所有项目?

谢谢。

【问题讨论】:

  • 请确保您拥有最新的 RxJava:1.0.17 或 1.1.0。
  • 我使用的是 1.0.14,也许是这样。我要再试一次。

标签: java rx-java


【解决方案1】:

首先,只是为了检查,请尝试关注

代替:

    .flatMapIterable(new Func1<List<Contact>, List<Contact>>() {
        @Override
        public List<Contact> call(List<Contact> contacts) {
            return contacts;
        }
    }

试试这个:

    .flatMap(new Func1<List<Contact>, Observable<Contact>>() {
        @Override
        public Observable<Contact> call(List<Contact> contacts) {
            return Observable.from(contacts);
        }
    })

如果没有帮助,请添加以下代码:

    restApi.getContacts(user)
        .doOnNext(new Action1<List<Contact>>() {
            @Override
            public void call(List<Contact> contacts) {
                Log.i(LOG_TAG, "first doOnNext size: " + contacts.size());
            }
        })
        .flatMapIterable(new Func1<List<Contact>, List<Contact>>() {
            @Override
            public List<Contact> call(List<Contact> contacts) {
                Log.i(LOG_TAG, "flatMapIterable size: " + contacts.size());
                return contacts;
            }
        })
        .flatMap(new Func1<Contact, Observable<Integer>>() {
            @Override
            public Observable<Integer> call(Contact Contact) {
                return create(Contact);
            }
        })
        .toList()
        .doOnNext(new Action1<List<Integer>>() {
            @Override
            public void call(List<Integer> integers) {
                Log.i(LOG_TAG, "second doOnNext size: " + contacts.size());
            }
        })

并在此处打印 Logcat 输出。

【讨论】:

  • 我要试试,谢谢!
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2016-07-15
  • 2023-03-31
  • 2018-10-12
  • 2018-06-18
相关资源
最近更新 更多