Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 472новые вакансии за сутки·93 728вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 124
  • Облачные технологии14 081
  • QA вакансии3 459
  • Backend вакансии2 116
  • Инженер данных1 804
  • Продакт-менеджер1 264

Разработка

  • Android1 866
  • iOS1 701
  • Fullstack вакансии988
  • AI вакансии952
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 662
  • Java6 548
  • Node.js2 019
  • .NET1 722
  • Kotlin1 619
  • Rust1 454
  • C#711
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 766
  • DevOps вакансии6 053
  • Linux-инфраструктура5 491
  • Terraform / IaC4 262
  • CI/CD3 242
  • Мониторинг и Observability1 787
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 140
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер615
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 297
  • Вакансии в Европе23 854
  • Вакансии в Канаде4 476
  • Работа в России3 921

По формату

  • Удалённые вакансии75 046
  • Релокация в США44 297
  • Гибридная работа12 398
  • Офисная работа7 076

По уровню

  • Senior вакансии42 676
  • Middle вакансии20 894
  • Junior вакансии6 725

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Jetpack ComposeВсе вопросы
Jetpack ComposeMiddleТеория

Что такое derivedStateOf и когда его следует использовать?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

derivedStateOf создаёт кэшированное производное значение из других State-объектов: рекомпозиция происходит только при изменении результата, а не каждый раз при изменении входных данных. Применяйте для фильтрации списков и агрегации scroll-offset, всегда вместе с remember.

Когда использовать

Главные сценарии:

  • Производное булево значение из часто меняющегося State (например, кнопка активна когда форма валидна).
  • Фильтрация/сортировка списка — список может обновляться часто, но результат фильтра — реже.
  • Агрегация scroll-offset в флаг видимости заголовка.
@Composable
fun SearchScreen() {
    val lazyListState = rememberLazyListState()
    val searchQuery = remember { mutableStateOf("") }
    val allItems = remember { getSampleItems() } // список из 1000 элементов

    // БЕЗ derivedStateOf: фильтрация запускается при каждом scroll,
    // даже когда searchQuery не изменился
    // val filtered = allItems.filter { it.contains(searchQuery.value) }

    // С derivedStateOf: фильтрация запускается только при изменении searchQuery
    val filteredItems by remember {
        derivedStateOf {
            allItems.filter { it.contains(searchQuery.value, ignoreCase = true) }
        }
    }

    // Флаг видимости кнопки «вернуться наверх»
    val showScrollToTop by remember {
        derivedStateOf { lazyListState.firstVisibleItemIndex > 0 }
    }

    Column {
        TextField(
            value = searchQuery.value,
            onValueChange = { searchQuery.value = it },
            placeholder = { Text("Search...") }
        )
        LazyColumn(state = lazyListState) {
            items(filteredItems) { item ->
                Text(item, modifier = Modifier.padding(8.dp))
            }
        }
        AnimatedVisibility(visible = showScrollToTop) {
            Button(onClick = { /* scroll to top */ }) {
                Text("Наверх")
            }
        }
    }
}

Что такое derivedStateOf

derivedStateOf создаёт объект State<T>, значение которого вычисляется из других State-объектов. Compose отслеживает, какие State-объекты читаются внутри блока вычисления, и пересчитывает результат только тогда, когда результат действительно изменился — даже если входные State меняются часто.

Ключевое отличие от простого чтения State: composable перекомпозируется не при каждом изменении входных значений, а только когда изменяется результат вычисления.

Как это работает внутри

Compose использует snapshot-систему. derivedStateOf { block } создаёт DerivedSnapshotState, который запускает block при чтении и запоминает, какие State-объекты были прочитаны. При изменении любого из них вычисление запускается снова, но рекомпозиция происходит только если equals() нового и старого результата возвращает false.

Когда derivedStateOf НЕ нужен

Если вычисление дешёвое (конкатенация строки, простое булево из одного State) — overhead от derivedStateOf превышает пользу. Также не нужен, если входные State меняются редко: обычная функция внутри composable будет проще и не хуже по производительности.

// Избыточно — простое условие не требует derivedStateOf
val isValid by remember { derivedStateOf { email.value.isNotEmpty() } }

// Достаточно читать напрямую
val isValid = email.value.isNotEmpty()

remember + derivedStateOf — обязательная пара

Всегда оборачивайте derivedStateOf в remember. Без remember новый DerivedSnapshotState создаётся при каждой рекомпозиции — вы теряете все преимущества кэширования и получаете утечку подписок.

Подводные камни

  • Забыли remember — без remember { derivedStateOf { ... } } оптимизации нет, каждая рекомпозиция создаёт новый объект.
  • Чтение нестабильного объекта внутри блока — если внутри блока читать обычную Kotlin-переменную (не State), изменение этой переменной не триггернёт пересчёт.
  • Дорогое вычисление без оптимизации — derivedStateOf не делает вычисление асинхронным; тяжёлые операции (сортировка O(n log n)) блокируют main thread так же, как и без него. Для тяжёлых вычислений используйте produceState или Flow в ViewModel.
  • Несколько уровней вложенности — derivedStateOf { derivedStateOf { ... }.value } работает, но усложняет отладку; предпочтительнее объединить в один блок.
  • Использование в ViewModel вместо composable — derivedStateOf принадлежит Compose runtime и не должен использоваться вне composable-контекста; для производных значений в ViewModel используйте StateFlow.map или combine.
  • Ожидание ленивого вычисления — блок вычисляется при первом чтении, а не сразу при создании; не рассчитывайте, что значение уже готово до первой рекомпозиции.

Частые вопросы на собеседовании

  • Что такое State в Jetpack Compose и как работает state hoisting?
  • Что такое recomposition и что её вызывает в Jetpack Compose?
  • В чём разница между remember и rememberSaveable?
  • Каковы лучшие практики производительности в Jetpack Compose (стабильность, пропускаемость)?

Типичные ошибки

  • Объяснять «derivedStateOf» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Использовать derivedStateOf для простого сложения строк - лишний overhead и ложная оптимизация.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

Что проверяет интервьюер

  • Формулирует суть темы «derivedStateOf» своими словами и связывает ее с кодом.
  • Называет механизм: Он полезен для дорогих или часто меняющихся входов, когда UI должен реагировать только на агрегированный результат.
  • Видит production-последствие: Использовать derivedStateOf для простого сложения строк - лишний overhead и ложная оптимизация.

Как вы знаете этот вопрос?

Проверить себя по теме Jetpack Compose →

Источники

  • https://developer.android.com/develop/ui/compose/side-effects

Связанные темы

Jetpack Composederived-state-of-reasoningui-state