如何在Kotlin Flow中过滤列表

时间:2019-12-22 14:30:17

标签: kotlin-coroutines kotlinx.coroutines.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实现这一目标?

1 个答案:

答案 0 :(得分:1)

鉴于使用的唯一运算符是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.
        }
    }