KT Kotlin  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Flow и реактивные потоки

Тест разбирает холодные Flow, операторы преобразования, StateFlow и SharedFlow на сценариях с повторной подпиской, отменой и медленным потребителем. Нужно различать хранение состояния, рассылку событий и момент, когда upstream действительно запускается.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
Что добавить в регрессионный набор для «Виртуальный debounce»?
Вопрос 2 из 25
Что станет новой точкой внимания после изменения «Две коллекции cold Flow»: Если источник дорогой и должен быть общим, явно преобразовать его через `shareIn`/`stateIn` в scope с понятным жизненным циклом?
Вопрос 3 из 25
Какие значения будут напечатаны?
KotlinОператоры · Порядок операторов Flow
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    (1..5).asFlow().map { it * 2 }.filter { it > 5 }.take(2)
        .collect { print("$it ") }
}
Вопрос 4 из 25
Какое правило нужно применить, чтобы объяснить «Conflation одинакового состояния»?
KotlinПоток состояния StateFlow · Conflation одинакового состояния
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val state = MutableStateFlow(0)
    state.value = 1
    state.value = 1
    println(state.value)
}
Вопрос 5 из 25
Как укрепить «Replay горячего потока», не переписывая соседние модули?
KotlinОбщий поток SharedFlow · Replay горячего потока
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val events = MutableSharedFlow<Int>(replay = 1)
    events.emit(7)
    println(events.replayCache)
}
Вопрос 6 из 25
Сколько раз появится `start`?
KotlinХолодные потоки · Две коллекции cold Flow
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun numbers() = flow { println("start"); emit(1); emit(2) }
fun main() = runBlocking {
    val f = numbers()
    f.collect { print(it) }
    f.collect { print(it) }
}
Вопрос 7 из 25
Какое объяснение результата «Порядок операторов Flow» выдерживает проверку соседними случаями?
KotlinОператоры · Порядок операторов Flow
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    (1..5).asFlow().map { it * 2 }.filter { it > 5 }.take(2)
        .collect { print("$it ") }
}
Вопрос 8 из 25
Какое изменение лучше всего защищает границу «Conflation одинакового состояния»?
KotlinПоток состояния StateFlow · Conflation одинакового состояния
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val state = MutableStateFlow(0)
    state.value = 1
    state.value = 1
    println(state.value)
}
Вопрос 9 из 25
Где упрощённое объяснение «Replay горячего потока» перестаёт работать?
Вопрос 10 из 25
Предложенная правка для «Виртуальный debounce» звучит так: Ограничить сбор ожидаемым числом элементов через take или библиотеку проверки потоков и завершить созданные jobs. Какой недостаток важнее обсудить?
Вопрос 11 из 25
Какое изменение лучше всего защищает границу «Порядок операторов Flow»?
KotlinОператоры · Порядок операторов Flow
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    (1..5).asFlow().map { it * 2 }.filter { it > 5 }.take(2)
        .collect { print("$it ") }
}
Вопрос 12 из 25
Где поведение «Conflation одинакового состояния» требует отдельной проверки?
Вопрос 13 из 25
Предложенная правка для «Replay горячего потока» звучит так: Выбирать replay по семантике: 0 для неповторяемых сигналов, 1+ для значений, которые действительно можно повторить новому потребителю. Какой недостаток важнее обсудить?
Вопрос 14 из 25
Как проверить debounce и отмену `mapLatest` детерминированно?
KotlinТестирование и инструменты · Виртуальный debounce
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.flow.*
fun search(queries: Flow<String>): Flow<String> = queries
    .debounce(300)
    .distinctUntilChanged()
    .mapLatest { "result:$it" }
Вопрос 15 из 25
Какое правило определяет поведение фрагмента «Две коллекции cold Flow»?
KotlinХолодные потоки · Две коллекции cold Flow
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun numbers() = flow { println("start"); emit(1); emit(2) }
fun main() = runBlocking {
    val f = numbers()
    f.collect { print(it) }
    f.collect { print(it) }
}
Вопрос 16 из 25
Что станет новой точкой внимания после изменения «Conflation одинакового состояния»: Обновлять сложное состояние через `update` и использовать устойчивые value-модели, а одноразовые события не кодировать повторным StateFlow-значением?
Вопрос 17 из 25
Какой результат даст пример «Replay горячего потока» без изменения окружения?
KotlinОбщий поток SharedFlow · Replay горячего потока
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val events = MutableSharedFlow<Int>(replay = 1)
    events.emit(7)
    println(events.replayCache)
}
Вопрос 18 из 25
На какой контракт языка или библиотеки опирается «Виртуальный debounce»?
KotlinТестирование и инструменты · Виртуальный debounce
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.flow.*
fun search(queries: Flow<String>): Flow<String> = queries
    .debounce(300)
    .distinctUntilChanged()
    .mapLatest { "result:$it" }
Вопрос 19 из 25
Как укрепить «Две коллекции cold Flow», не переписывая соседние модули?
KotlinХолодные потоки · Две коллекции cold Flow
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun numbers() = flow { println("start"); emit(1); emit(2) }
fun main() = runBlocking {
    val f = numbers()
    f.collect { print(it) }
    f.collect { print(it) }
}
Вопрос 20 из 25
Какой редкий случай способен сломать наивную трактовку «Порядок операторов Flow»?
Вопрос 21 из 25
Что в семантике Kotlin или используемого API объясняет «Replay горячего потока»?
KotlinОбщий поток SharedFlow · Replay горячего потока
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val events = MutableSharedFlow<Int>(replay = 1)
    events.emit(7)
    println(events.replayCache)
}
Вопрос 22 из 25
Какая правка устраняет причину риска в «Виртуальный debounce», а не только его проявление?
KotlinТестирование и инструменты · Виртуальный debounce
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.flow.*
fun search(queries: Flow<String>): Flow<String> = queries
    .debounce(300)
    .distinctUntilChanged()
    .mapLatest { "result:$it" }
Вопрос 23 из 25
Что проверить отдельно, чтобы не принять «Две коллекции cold Flow» за универсальное правило?
Вопрос 24 из 25
В «Порядок операторов Flow» выбрали решение: Располагать дешёвую фильтрацию до тяжёлого преобразования, если это не меняет смысл, и измерять буферизацию отдельно. Какова его реальная цена?
Вопрос 25 из 25
Какое значение будет выведено и что важно для подписчиков?
KotlinПоток состояния StateFlow · Conflation одинакового состояния
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val state = MutableStateFlow(0)
    state.value = 1
    state.value = 1
    println(state.value)
}

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу