Android RXJAVA将嵌套自定义列表组合在一个列表中



层次结构

List<Job> myJob;//将两个列表视为不为空

List<Tasks> myTasks = myJob.getTasks();

我目前正在使用以下代码

  Observable.just(myJob)
                    .subscribeOn(Schedulers.computation())
                    .concatMap(Observable::fromIterable)
                    .subscribe(new DefaultObserver<Job>() {
                        @Override
                        public void onNext(@NonNull Job myJob) {
                            Log.d(Utils.APP_LOG,
                                    "Total Task: n " +
                                     "Job id-" + myJob.getJobId()
                                     + "tasks-" + myJob.getTasks().size());
                        }
                        @Override
                        public void onError(@NonNull Throwable e) {
                        }
                        @Override
                        public void onComplete() {
                        }
                    });

我能够获取父(myjob)列表和子(任务)列表。现在,我想将每个作业的任务列表组合到一个列表中。

我尝试使用此接受的答案执行查询,但是在我的方案作业(父)列表大小和任务(儿童)列表大小都是动态的。

Single<List<Tasks>> taskObservable = Observable.fromIterable(myJob)
            .flatMapIterable(Job::getTasks)
            .toList();

上述代码将执行以下操作:

  1. 获取您的工作列表,然后将其转换为发出Job S
  2. 的流
  3. 对于每项工作,将其转换为发射Tasks
  4. 的流
  5. 将所有发射的任务收集到一个列表中,并发出List

如果任务可以引用其父,则在您的情况下会有所帮助。要获取所有任务的列表,您可以使用flatMapconcatMap

Observable.just(myJob)
                .subscribeOn(Schedulers.computation())
                .concatMap(Observable::fromIterable)
                .flatMapIterable(job -> job.getTasks())
                .subscribe(new DefaultObserver<Task>() {
                    @Override
                    public void onNext(@NonNull Task myTask) {
                        Log.d(Utils.APP_LOG,
                                "Total Task: n " +
                                 "Job id-" + myTask.getJob().getId()
                                 + "tasks-" + myTask);
                    }
                    @Override
                    public void onError(@NonNull Throwable e) {
                    }
                    @Override
                    public void onComplete() {
                    }
                });

最新更新