如何在 Kotlin Flow 中过滤列表
How to filter a list inside Kotlin Flow
我正在使用 RxJava
将我当前的实现替换为 Coroutines
和 Flow
。我在使用某些 Flow
运算符时遇到了一些问题。
我正在尝试过滤 Flow
中的项目列表,然后再提供以供收集。 (Flow<List<TaskWithCategory>>
)
这是 Rx2
上的示例:
repository.findAllTasksWithCategory()
.flatMap {
Flowable.fromIterable(it)
.filter { item -> item.task.completed }
.toList()
.toFlowable()
在上面的实施中,我提供了一个 TaskWithCategory
过滤列表 Task
已经完成。
如何使用 Flow
实现此目的?
考虑到唯一使用的运算符是 filter
内部 flowable 是不必要的,使流程实现非常简单:
repository.findAllTasksWithCategoryFlow()
.map { it.filter { item -> item.task.completed } }
如果涉及更多的内部转换(让我们使用transform: suspend (X) -> TaskWithCategory
):
repository.findAllTasksWithCategoryFlow()
// Pick according to desired backpressure behavior
.flatMap(Latest/Concat/Merge) {
// Scope all transformations together
coroutineScope {
it.map { item ->
// Perform transform in parallel
async {
transform(item)
}
}.awaitAll() // Return when all async are finished.
}
}
我正在使用 RxJava
将我当前的实现替换为 Coroutines
和 Flow
。我在使用某些 Flow
运算符时遇到了一些问题。
我正在尝试过滤 Flow
中的项目列表,然后再提供以供收集。 (Flow<List<TaskWithCategory>>
)
这是 Rx2
上的示例:
repository.findAllTasksWithCategory()
.flatMap {
Flowable.fromIterable(it)
.filter { item -> item.task.completed }
.toList()
.toFlowable()
在上面的实施中,我提供了一个 TaskWithCategory
过滤列表 Task
已经完成。
如何使用 Flow
实现此目的?
考虑到唯一使用的运算符是 filter
内部 flowable 是不必要的,使流程实现非常简单:
repository.findAllTasksWithCategoryFlow()
.map { it.filter { item -> item.task.completed } }
如果涉及更多的内部转换(让我们使用transform: suspend (X) -> TaskWithCategory
):
repository.findAllTasksWithCategoryFlow()
// Pick according to desired backpressure behavior
.flatMap(Latest/Concat/Merge) {
// Scope all transformations together
coroutineScope {
it.map { item ->
// Perform transform in parallel
async {
transform(item)
}
}.awaitAll() // Return when all async are finished.
}
}