Как отфильтровать список внутри 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
s, которые уже завершены.
Как я могу добиться этого, используя Flow
?
1 ответ
Решение
Учитывая, что единственный используемый оператор - filter
внутренний поток не нужен, что делает реализацию потока довольно простой:
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.
}
}