如何在 Kotlin Flow 中过滤列表

How to filter a list inside Kotlin Flow

我正在使用 RxJava 将我当前的实现替换为 CoroutinesFlow。我在使用某些 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.
        }
    }