Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpFwCb 195 of 299 menu
◀ ▶

Соединение потоков в 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" соедините так, чтобы на выходе печаталась сумма числа и длины строки партнера.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить