gpt4 book ai didi

java - RxJava 将一个列表转换为另一个列表时遇到问题

转载 作者:行者123 更新时间:2023-12-01 17:50:52 25 4
gpt4 key购买 nike

我正在尝试转换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

最佳答案

toList 需要有限的源,但 getAllTask​​s 可能是无限的,不幸的是,这在 Android 数据库支持的 DAO 中非常典型。将 getAllTask​​s 更改为 Single、使用 take(1)、使用 timeout() 或使用 flatMap(Observable.fromIterable().map().toList()) 而不是 flatMapIterable

I want to receive any updates made to tasks in db.

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

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

关于java - RxJava 将一个列表转换为另一个列表时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50318141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com