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

Холодный Flow собирают дважды

Вопрос

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

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

fun main() = runBlocking {
    val f = flow {
        println("start")
        emit(1)
        emit(2)
    }.map { it * 10 }
    println("created")
    f.collect { println(it) }
    println(f.first())
}

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

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

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

Коротко

Код выведет: created, start, 10, 20, start, 10. Создание Flow ничего не выполняет, поэтому сначала created.

Что выведет

created
start
10
20
start
10

Разбор

Создание Flow ничего не выполняет, поэтому сначала created. Каждый терминальный оператор запускает билдер заново: collect печатает start, 10 и 20. first() снова печатает start, берёт первое значение 10 и отменяет поток, второй emit уже не выполняется.

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

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