Ограничение числа в потоке в Kotlin
Источник может быть бесконечным или просто
длиннее, чем нужно сейчас. take
обрезает поток: после N принятых значений
оператор отменяет дальнейший сбор, и строитель
тоже останавливается.
Из длинной цепочки чисел можно взять только первые три:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
flow {
emit(10)
emit(20)
emit(30)
emit(40)
emit(50)
}.take(3)
.collect { value ->
println(value)
}
}
}
Печатаются 10, 20 и 30.
Четвертое и пятое значения до collect
не доходят.
Ограничение работает и на потоке с emit
в цикле - лишние итерации не выполняются:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val stream = flow {
var i = 0
while (true) {
emit(i)
i++
}
}.take(2)
stream.collect { n ->
println(n)
}
}
}
В консоли только 0 и 1.
Бесконечный цикл в строителе прерван отменой
после второго элемента.
Из потока букв "w", "x",
"y", "z" возьмите первые
две через take и выведите их.
Цикл от 0 до 9 отправляет
индексы в поток. Оставьте только первые
4 числа и соберите их в
runBlocking.