Преобразование потока в Kotlin
Сборщику не всегда нужны сырые значения из
emit. Оператор map принимает
функцию от элемента и возвращает поток, где
каждая ячейка уже заменена результатом этой
функции.
Строки можно привести к длине, не меняя исходный строитель:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val words = flow {
emit("cat")
emit("kotlin")
}.map { text -> text.length }
words.collect { len ->
println(len)
}
}
}
В консоли 3 и 6 - порядок
сохраняется, меняется только вид данных на
выходе map.
Цепочку операторов удобно читать сверху вниз:
сначала источник, затем преобразование, в конце
collect:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
flow {
emit(2)
emit(4)
emit(6)
}.map { n -> n * n }
.collect { square ->
println(square)
}
}
}
Квадраты 4, 16 и 36
приходят по одному, как и исходные числа.
map не пропускает и не дублирует
элементы - на каждый вход один выход.
Поток из строк "go" и "up"
пропустите через map в верхний
регистр. Соберите и выведите обе строки.
Из чисел 1, 2, 3
сделайте поток удвоенных значений через
map и напечатайте результат сбора.