Как отфильтровать список внутри 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 фильтрация по Tasks, которые уже завершены.

Как я могу добиться этого, используя 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.
        }
    }
Другие вопросы по тегам