Отбор в потоке в Kotlin
Не каждое значение из emit нужно
сборщику. Функция filter оборачивает поток
предикатом: если проверка ложна, элемент
исчезает из цепочки, не вызывая лямбду
collect.
Из смешанного набора чисел можно оставить только четные:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
flow {
emit(1)
emit(2)
emit(3)
emit(4)
}.filter { n -> n % 2 == 0 }
.collect { even ->
println(even)
}
}
}
Печатаются 2 и 4. Нечетные
номера отброшены до приема, порядок оставшихся
не нарушен.
Условие может опираться на свойства строк - например, длину:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val tags = flow {
emit("io")
emit("data")
emit("rx")
}.filter { word -> word.length >= 4 }
tags.collect { kept ->
println(kept)
}
}
}
До сборщика доходит только "data".
Функция filter не создает новых значений -
лишь сужает поток.
Из чисел 5, 10, 15
оставьте те, что больше 8, через
filter. Выведите отобранные значения.
Поток букв "a", "bb", "ccc"
соберите только с непустыми строками длиной
не меньше двух символов.