java - 即使 range() 运算符迭代自身对应于传入的范围,如何仅发出整个列表一次

标签 java android rx-java reactive-programming rx-java2

问题 我有一个在调用某些 API 后来自后端的列表,我需要将该列表转换为其他类型的列表。之后,我需要将 n 个空对象添加到最终列表中。 (n 数字来自适合我的应用程序的某种逻辑。)

为了解决这个问题,我编写了以下代码:

Observable.fromIterable(snipList).map(new Function<UserSnipModel, TaskContent>() {
        @Override
        public TaskContent apply(UserSnipModel userSnipModel) throws Exception {
            String displayName = userSnipModel.getDisplayName();
            TaskContent.Fields fields = new TaskContent.Fields(userSnipModel.getId(),
                    displayName, userSnipModel.getUrlCall(), userSnipModel.getRemarks(), userSnipModel.isEnableCall());
            Drawable icon = DrawableUtils.getDrawable(HomeActivity.this, userSnipModel.getIconName(), R.drawable.ic_diamond);
            return new TaskContent(fields, icon);
        }
    }).toList().toObservable().flatMap(new Function<List<TaskContent>, ObservableSource<List<TaskContent>>>() {
        @Override
        public ObservableSource<List<TaskContent>> apply(List<TaskContent> taskContents) throws Exception {
            return Observable.range(0, totalNumberOfMembers - numberOfItems).map(new Function<Integer, List<TaskContent>>() {
                @Override
                public List<TaskContent> apply(Integer integer) throws Exception {
                    taskContents.add(new TaskContent(new TaskContent.Fields("",
                            "", "", "", false), null));
                    return taskContents;
                }
            });
        }
    })
.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).safeSubscribe(new Observer<ListTaskContent>>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(List<TaskContent> taskContents) {
        //This method is called  multiple time.
        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
        }

        @Override
        public void onComplete() {
        }
    });

当我运行这个时,onNext()被多次调用,但未按预期工作。为了解决这个问题我添加了 toList()里面flatMap()然后我得到List<List<TastContent>>这也不是预期的,因为我只需要 List<TaskContent>

我可以做什么来解决这个问题?

提前致谢。

最佳答案

我建议这个解决方案:

Observable.fromIterable(list)
    .map(item -> item.concat("new")) //Converting the items in the initial list
    .toList()
    .flatMap(data -> Single.zip(
            Single.just(data), //Mapped data set
            Observable.range(0, data.size()) //Empty list generator
                    .map(rangeVal -> rangeVal.toString())
                    .toList(),
            (initialList, emptyList) -> {
                initialList.addAll(emptyList); //Appending lists
                return initialList;
            }
            )
    )
    .subscribe(data -> {}, error -> {});

关于java - 即使 range() 运算符迭代自身对应于传入的范围,如何仅发出整个列表一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444695/

相关文章:

java - 如何使用 packageManager 在 android java 中获取克隆的应用程序?

java - 迁移后 Eclipse 不会将邮件属性传递给 Spring Boot

android - 如何检查打开的对话框?

android - 如何在 TextInputLayout 中使用(提示)标签 float 左侧可绘制对象?

android - 了解数据流和多个订阅者(使用改造)

java - 为什么 Java 7 中 String 的 switch 语句比 if else 快?

java - Hibernate,在不加载关联实体的情况下获取外部ID

Android:ActionBar 中的全宽 SearchView

rx-java - 在 Rxjava 中使用 Flowable 时无法处理错误

android - RxJava 与 SQlite 和 ContentProvider 操作