Поток из коллекции в Kotlin
Данные часто уже лежат в List или другой
коллекции. Расширение asFlow оборачивает
её в Flow: элементы отдаются по одному
в том же порядке, что при обходе коллекции.
Список строк становится потоком без ручного
emit в цикле:
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val palette = listOf("cyan", "magenta", "yellow")
palette.asFlow().collect { hue ->
println(hue)
}
}
}
Три названия цвета идут подряд. Функция asFlow
не копирует коллекцию ради нового типа - лишь
меняет способ чтения на последовательный сбор.
После обёртки доступны те же операторы, что у
flowOf:
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val ids = listOf(4, 7, 10, 13)
ids.asFlow()
.filter { id -> id > 6 }
.collect { id ->
println(id)
}
}
}
Печатаются 7, 10 и 13.
Исходный список при этом не меняется.
Дан список "mon", "tue",
"wed". Превратите его в поток через
asFlow и выведите все дни.
Список чисел 2, 5, 8,
11 соберите как поток, удвойте каждый
элемент через map и напечатайте
результат.