inline в Kotlin — это модификатор функции. Он просит компилятор подставить тело функции в место вызова. Чаще всего inline используют для функций, которые принимают lambda, чтобы уменьшить лишние объекты и вызовы
Простой пример:
inline fun measure(block: () -> Unit) {
val start = System.currentTimeMillis()
block()
val end = System.currentTimeMillis()
println("Время: ${end - start} мс")
}
fun main() {
measure {
println("Работаем")
}
}
Снаружи это выглядит как обычная функция. Разница в том, как компилятор обработает вызов
Зачем нужен inline
В Kotlin функции могут принимать lambda:
fun runAction(action: () -> Unit) {
action()
}
Это удобно, но иногда создает дополнительный объект lambda и вызов. Для маленьких часто вызываемых функций высшего порядка inline может убрать эту накладную стоимость
Именно поэтому многие стандартные функции Kotlin выглядят очень легко в коде: let, run, use, synchronized и похожие приемы активно используют идею inline
Когда inline полезен
Используйте inline, если функция:
- маленькая;
- принимает одну или несколько lambda;
- часто вызывается;
- служит оберткой над повторяющимся шаблоном.
Не нужно ставить inline на каждую функцию. Большая inline-функция может раздуть байткод, потому что ее тело будет подставляться в места вызова
noinline и crossinline
Если inline-функция принимает несколько lambda, иногда одну из них нельзя или не нужно инлайнить. Тогда используют noinline
inline fun process(
action: () -> Unit,
noinline logger: () -> Unit
) {
action()
logger()
}
crossinline нужен, когда lambda будет вызвана внутри другого объекта или Runnable, и вы хотите запретить нелокальный return
Для новичка главное понять базовую идею: inline меняет не смысл кода для читателя, а способ компиляции
Как проверить
Запустите пример с measure, убедитесь, что блок выполняется. Затем уберите inline: программа будет вести себя так же. Разница проявляется не в выводе, а в скомпилированном коде и возможностях вроде reified type parameters
Где inline часто встречается
Новичок может не писать свои inline-функции каждый день, но он постоянно пользуется ими через стандартную библиотеку. Например, когда вы пишете:
val name: String? = "Kotlin"
name?.let {
println(it.uppercase())
}
let выглядит как обычная функция, но благодаря inline не создает лишней тяжелой обертки вокруг маленького lambda-блока. Поэтому важно не только «знать слово inline», а понимать, почему Kotlin-код с lambda может оставаться достаточно легким
Частые ошибки
Думать, что inline ускоряет любой код
Нет. Если функция большая или не принимает lambda, пользы может не быть
Использовать inline для красоты
inline — не украшение. Если нет причины, оставьте обычную функцию
Не понимать нелокальный return
В inline-lambda return может выйти из внешней функции. Это мощно, но иногда неожиданно. Если поведение странное, проверьте, не связан ли код с inline
Что почитать дальше по Kotlin
Если нужен общий маршрут по теме, откройте рубрику Kotlin. Для соседних задач пригодятся эти разборы:
- jOOQ и Kotlin: как использовать для SQL-запросов
- Coroutines в Kotlin: первый async-пример
- Kotlin Android: первый экран без перегруза
- Kotlin serialization: как настроить JSON на простом примере



