Что выведет код Senior Flow, StateFlow и SharedFlow обновлено

StateFlow и одинаковые значения

Вопрос

Что выведет код? По строке на каждый вывод.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val state = MutableStateFlow(0)
    val job = launch {
        state.collect { println("got $it") }
    }
    yield()
    state.value = 1
    yield()
    state.value = 1
    yield()
    state.value = 2
    yield()
    job.cancel()
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: got 0, got 1, got 2. Подписчик сразу получает текущее значение 0.

Что выведет

got 0
got 1
got 2

Разбор

Подписчик сразу получает текущее значение 0. Присваивание 1 доставляется. Повторное присваивание того же значения 1 игнорируется: StateFlow сравнивает через equals и не эмитит равные значения. Затем приходит 2. yield() даёт коллектору в том же потоке шанс обработать каждое изменение.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.