Что такое холодный поток в flow

Ответ

Холодный поток (cold flow) в Kotlin Flow — это поток, который начинает испускать данные только при наличии активного подписчика. Каждая подписка запускает выполнение потока заново.

Особенности:

  • Ленивая инициализация (выполняется только при вызове collect)
  • Независимые подписки (каждый collect запускает поток с начала)
  • Пример: flow { ... }, asFlow()

Пример:

val coldFlow = flow {
    println("Emitting 1")
    emit(1)
    println("Emitting 2")
    emit(2)
}

// Первый collect
coldFlow.collect { println("Received $it") } // Выведет 1, 2  

// Второй collect (запустится заново)
coldFlow.collect { println("Received again $it") } // Выведет 1, 2 снова  

Ответ 18+ 🔞

А, холодный поток! Ну это ж классика, ебать мои старые костыли. Представь себе, что у тебя есть не какая-то мартышлюшка, которая сама по себе тараторит, а нормальный, адекватный источник. Он сидит себе тихо, не дергается, и начинает что-то делать только тогда, когда к нему пришли и сказали: «Ну давай, чувак, работай».

Короче, суть:

  • Ленивый, как студент на первой паре. Пока на него не подписались (не вызвали collect), он нихрена не делает. Просто висит в памяти, красивый такой, и ждёт своего часа.
  • Каждая подписка — это новый заезд. Это не как в баре, где один рассказывает анекдот, а все слушают. Это как если бы ты каждый раз заново включал одну и ту же песню. Первый раз послушал — исполнитель спел. Второй раз нажал play — он снова начинает петь с самого начала, ёпта. Независимые подписки, блядь.
  • Откуда берётся: обычный flow { ... } или asFlow() — они все такие, холодные.

Смотри, как это выглядит в коде, тут всё просто:

val coldFlow = flow {
    println("Emitting 1")
    emit(1)
    println("Emitting 2")
    emit(2)
}

// Первый чувак подписался
coldFlow.collect { println("Received $it") } // Консоль: Emitting 1, Received 1, Emitting 2, Received 2

// Пришёл второй, и всё по новой!
coldFlow.collect { println("Received again $it") } // И опять: Emitting 1, Received again 1, Emitting 2, Received again 2

Видишь? Он каждый раз заново println выводит. Не кэширует нихуя. Чистый, честный холодный поток. Удобная штука, когда тебе нужно, чтобы логика запускалась свежаком для каждого слушателя. А то бывает, подпишешься второй раз, а тебе уже остатки с прошлого раза выдают — доверия ебать ноль. Тут такого нет.