RxJava无法将一个列表转换为另一个列表

时间:2018-05-13 16:16:23

标签: java android rx-java rx-java2

我正在尝试将Flowable<List<TaskEntity>>转换为Flowable<List<Task>>,但有些错误。 要理解我尝试转换更简单列表的问题,它工作正常。当我尝试将相同的逻辑应用于我的实际问题时,它无法正常工作。

这个逻辑给了我预期的输出。 [No.1 No.2 No.3]

Flowable.fromArray(Arrays.asList(1,2,3))
        .flatMapIterable(ids->ids)
        .map(s->"No. "+s)
        .toList()
        .toFlowable()
        .subscribe(
                t -> Log.d(TAG, "getAllActiveTasks: "+t)
        );

这种逻辑不起作用。 无打印

    mTaskDao.getAllTasks(STATE_ACTIVE)
            .flatMapIterable(task -> task)
            .map(Task::create)
            .toList()
            .toFlowable()

            .subscribe(
                    t -> Log.d(TAG, "getAllActiveTasks: "+t)
            );

修改1 这就是Task.create()的样子。

     public static Task create(TaskEntity eTask) {
         Task task = new Task(eTask.getTaskId(), eTask.getTaskTitle(), eTask.getTaskStatus());
         task.mTaskDescription = eTask.getTaskDescription();
         task.mCreatedAt = eTask.getCreatedAt();
         task.mTaskDeadline = eTask.getTaskDeadline();
         return task;
     }

解决方案

如评论中所述,toList()只有在发射源具有有限数量的项目时才能工作。由于来自Dao方法的Flowable包含无限的对象流,因此我没有正确使用toList()。

查看此评论以了解解决此问题的确切方法。 https://stackoverflow.com/a/50318832/4989435

2 个答案:

答案 0 :(得分:3)

toList需要有限的来源,但getAllTasks可能是无限的,不幸的是,这是由Android数据库支持的DAO非常典型。将getAllTasks更改为Single,使用take(1),使用timeout(),或使用flatMap(Observable.fromIterable().map().toList())代替flatMapIterable

  

我希望收到对db。

中的任务所做的任何更新

在这种情况下,您需要后一个选项:

mTaskDao.getAllTasks(STATE_ACTIVE)
        .flatMapSingle(task -> 
             Observable.fromIterable(task)
            .map(Task::create)
            .toList()
        )
        .subscribe(
                t -> Log.d(TAG, "getAllActiveTasks: "+t)
        );

答案 1 :(得分:0)

您应该只使用map运算符将TaskEntity转换为Task。我创建了sample。您可以检查我的解决方案,该解决方案仅使用地图运算符