Соединение потоков в Kotlin
Два независимых источника часто нужно свести в
одну картину. Функция combine запоминает
последнее значение каждой стороны и при
изменении любой из них вызывает функцию
слияния с актуальной парой.
Медленный и быстрый потоки дают строку из последних токенов обеих линий:
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val left = flow {
emit("L1")
delay(50)
emit("L2")
}
val right = flow {
emit("R1")
}
left.combine(right) { l, r -> "$l+$r" }
.collect { pair ->
println(pair)
}
}
}
Сначала "L1+R1", после второго
emit слева - "L2+R1".
Правая сторона не менялась, но комбинация
обновилась из-за левого потока.
Когда обе линии двигаются, каждое новое значение с любой стороны пересчитывает результат:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val nums = flowOf(1, 2)
val tags = flowOf("a", "b")
nums.combine(tags) { n, t -> n to t }
.collect { duo ->
println(duo)
}
}
}
Пары пересчитываются по мере появления
элементов; последняя комбинация отражает
свежие значения обоих Flow. Это не
попарное сцепление по индексу - для того
есть отдельный оператор.
Один поток отдает "hot", другой -
"cold". Сложите строки через
combine в одну с дефисом между
частями и выведите результат сбора.
Потоки 10, 20 и "x",
"y" соедините так, чтобы на выходе
печаталась сумма числа и длины строки
партнера.