Рубрика: Kotlin

  • Как отменяется Flow? Что происходит при отмене корутины, в которой идёт collect?

    Давайте разберём всё по шагам. Что происходит, если отменить корутину, где происходит collect()? При отмене: Как Flow узнаёт, что нужно остановиться? Алгоритм проверки: Важно: flow {} должен быть cancellation-cooperative Сancellation-cooperative — означает, что внутри корутины не должно быть блокирующих элементов. Действие внутри flow Реакция на отмену корутины delay(), emit(), collect() Хорошо: прерываются автоматически. Они Сancellation-cooperative…

  • Что делает оператор collect? Можно ли вызвать его из обычной функции?

    Оператор collect в Flow (и StateFlow, SharedFlow) — это терминальный оператор, без которого Flow не начнёт выполняться. Что делает collect collect — suspend-функция Это значит: ты не можешь вызвать collect() из обычной функции без suspend или coroutineScope. Почему collect — suspend? Потому что: Следовательно нужно вызывать функцию collect() из другой suspend-функции или scope.

  • В чём разница между flow{}, StateFlow, SharedFlow и Channel?

    Flow {} — холодный поток StateFlow — горячий поток с состоянием SharedFlow — горячий поток для событий Channel — двусторонняя труба

  • Холодные vs горячие потоки — объясни на примерах

    Разделение на холодные (cold) и горячие (hot) потоки — это одна из ключевых концепций реактивного/корутин-флоуного программирования. Холодный поток (cold) Горячий поток (hot) Когда начинается При подписке (collect()) Начинается независимо от подписчиков Повторное получение Каждый collector получает свои данные Все collectors получают одно общее событие Поведение Как фабрика: «новый клиент — новая история» Как радио: «идёт…

  • Что такое Flow? Чем отличается от Sequence и Suspend-функции?

    Flow — это асинхронный стрим данных в Kotlin Coroutines, аналог Rx, но в корутинном стиле. Его важно понимать и уметь отличать от Sequence и suspend-функций. Flow<T> — это тип, представляющий ленивый асинхронный поток значений, который эмитит (emit) несколько значений во времени, при этом не блокируя поток. Ключевые свойства Flow Чем отличается от других? Сравнение suspend…

  • Расскажи про контракт между Job-ами в иерархии

    Контракт между Job-ами — ключевая фича корутин, которая спасает от утечек и делает код предсказуемым. И тем самым реализует Structured Concurrency. Основной контракт (золотое правило) Job-а родительской корутины ждёт завершения всех своих дочерних корутин и дочерняя корутина не может пережить родителя. Что происходит автоматически (контракт) Ситуация Что произойдёт автоматически Родитель завершился успешно Ждёт всех детей…

  • Основные билдеры корутин? Разница между launch и async

    В Kotlin Coroutines есть три основных билдера для запуска корутин: Ключевая разница между launch() и async() launch() — это fire-and-forget, возвращает Job, ошибки сразу пробрасываются вверх. async() — это «будущий результат», возвращает Deferred, ошибки откладываются и выстреливают только в момент await(). Ошибки, которые часто делают: Ошибка Почему плохо? val data = async { … }…

  • Как работают suspend функции?

    Suspend — это просто маркер на уровне компилятора Kotlin. Он как бы говорит: «Эта функция может приостанавливаться, но при этом оставаться в том же потоке». На уровне JVM-кода suspend-функция превращается в обычный метод с дополнительным параметром Continuation<T> и возвращает Any?. Что такое Continuation? Continuation<T> — это объект-колбэк, который как бы говорит: «Когда операция закончится —…

  • Что такое Coroutine Dispatchers? Какие виды есть?

    Coroutine Dispatchers — это механизм, управляющий тем, на каком(-их) потоке(-ах) или в каком пуле будет выполняться корутина. Dispatcher — это часть контекста корутины (CoroutineContext), элемент CoroutineContext.Element, задающий CoroutineDispatcher. Если при запуске корутины не задан явный dispatcher, используется контекст родителя или Dispatchers.Default Основные виды встроенных Dispatcher‑ов:

  • Основные интерфейсы коллекций в Kotlin-е

    В Kotlin (особенно в JVM-ориентированных проектах, таких как Android), основные коллекции строятся поверх Java Collection Framework, но Kotlin добавляет расширения, безопасный синтаксис и функциональный стиль. Основные интерфейсы коллекций в Kotlin Интерфейс Назначение Пример реализации Collection<T> Базовый интерфейс для всех коллекций List, Set, MutableList List<T> Упорядоченная коллекция с доступом по индексу listOf(1, 2, 3) Set<T> Уникальные…

  • Kotlin Contracts зачем нужны? Где использовать?

    Contracts в Kotlin — это способ сообщить компилятору о свойствах функции, которые нельзя выразить типами. Обычно это: Зачем нужны Kotlin Contracts? Пример 1: Smart cast без контракта Компилятор не знает, что isString(x)==true, то есть x точно String. Пример 2: С контрактом

  • Какая польза от typealias? Во что он компилируется?

    typealias в Kotlin это просто псевдоним для типа.Он не создаёт новый тип, а даёт другое имя уже существующему. Польза от typealias Польза Пример Повышение читаемости Username вместо String, Handler вместо (Int, String) -> Unit Переименование длинных типов Map<String, List<Pair<Int, String>>> → typealias UserMap = … Упрощение внедрения API Поддержка устаревшего/внешнего имени, не меняя реальный тип…