Пара значений в потоке в Kotlin
Когда нужны именно синхронные пары - первый с
первым, второй со вторым - подходит zip.
Оператор ждет элемент с обеих сторон; как
только пара готова, вызывается функция
объединения. Более длинный хвост отбрасывается.
Два коротких потока дают ровно столько пар, сколько элементов у более короткого:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.zip
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val keys = flowOf("k1", "k2", "k3")
val vals = flowOf(10, 20)
keys.zip(vals) { k, v -> "$k=$v" }
.collect { line ->
println(line)
}
}
}
Печатаются "k1=10" и "k2=20".
Третий ключ не получает партнера - zip
уже завершился.
Пары можно собирать в структуры или кортежи без промежуточных строк:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.zip
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
flowOf(1, 2, 3)
.zip(flowOf("a", "b", "c")) { n, ch ->
n to ch
}
.collect { duo ->
println(duo)
}
}
}
Три пары (1, a), (2, b),
(3, c) идут строго по индексу.
Функция zip не пересчитывает старые пары при
новых значениях - в отличие от combine.
Потоки "one", "two" и
1, 2, 3 свяжите
через zip в строки вида
"one:1". Выведите все получившиеся
строки.
Буквы "A", "B" и цифры
9, 8, 7, 6
объедините попарно и напечатайте каждую
пару как два символа через запятую.