【问题标题】:RxJava Having trouble Converting one list to another listRxJava 无法将一个列表转换为另一个列表
【发布时间】:2018-05-14 01:53:34
【问题描述】:

我正在尝试将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;
     }

解决方案

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

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

【问题讨论】:

  • TaskEntry 和 Task 如何相互关联?
  • @LeviAlbuquerque,它们几乎相同。 TaskEntity 符合我的数据库表,从表示的角度来看,Task 更有意义。因此,在 Task.create() 中,我将更改诸如将 TaskEntity 中的时间戳转换为 Java Date 对象等内容。
  • toList 需要有限的源,但 getAllTasks 可能是无限的,不幸的是,这在 Android 数据库支持的 DAO 中非常典型。将getAllTasks 更改为Single,使用take(1),使用timeout(),或者使用flatMap(Observable.fromIterable().map().toList()) 而不是flatMapIterable
  • @akarnokd,您的解释对我来说确实有意义,但我仍然感到困惑。我想接收对 db 中的任务所做的任何更新。而且我认为使用 Single 意味着它会在运行一次后停止。对吗?

标签: java android rx-java rx-java2


【解决方案1】:

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)
        );

【讨论】:

  • 我尝试了这个解决方案并且它有效。你为我省去了很多麻烦。我刚刚又拿起了 RxJava(在去年简单介绍过它之后)。我需要投入更多的时间。谢谢。
【解决方案2】:

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

【讨论】:

  • 感谢您的示例。我经历了它,但它并没有解决我的问题。我希望链接的最终结果是 >,您的样本返回的是 >。我认为罪魁祸首是 .toList() 方法无法正常工作。您可以尝试更新您的示例以发出任务列表而不是发出单个任务吗?
  • 请将代码添加到您的答案中,以免后代丢失信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多