Как создать весь список только один раз, даже если оператор range () выполняет итерацию, соответствующую переданному в нем диапазону - PullRequest
0 голосов
/ 04 июня 2019

Проблема У меня есть список, который поступает из бэкэнда после вызова некоторого API, мне нужно преобразовать этот список в какой-то другой тип списка.После этого мне нужно добавить номер пустого объекта в окончательный список.(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>

Что я могу сделать, чтобы решить эту проблему?

Заранее спасибо.

1 Ответ

0 голосов
/ 04 июня 2019

Я бы предложил это решение:

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 -> {});
...