Ответ
Inline-функции в Kotlin используются для оптимизации производительности, заменяя вызов функции на её тело во время компиляции. Это полезно для высоконагруженных участков кода или лямбда-выражений, передаваемых в функции высшего порядка (например, filter, map).
Пример:
inline fun measureTime(block: () -> Unit) {
val start = System.currentTimeMillis()
block()
println("Time: ${System.currentTimeMillis() - start}ms")
}
Плюсы:
- Уменьшает накладные расходы на вызов функции (особенно с лямбдами).
- Позволяет использовать
returnиз внешней функции внутри лямбды (non-local returns).
Ограничения:
- Увеличивает размер билда (тело функции вставляется в каждое место вызова).
- Нельзя использовать для рекурсивных функций или сложных функций с большим телом.
Используйте inline осознанно, только когда это действительно даёт преимущества в производительности.
Ответ 18+ 🔞
А, слушай, про инлайны в котлине? Ну это же, ёпта, классика! Представь, у тебя есть функция, маленькая такая, но вызываешь ты её дохуя раз, прям в самом пиздеце цикла какого-нибудь. И каждый раз, когда ты её вызываешь, система, блядь, тратит время на то, чтобы перепрыгнуть в другое место в памяти, там что-то подготовить, потом обратно вернуться... Овердохуища лишних телодвижений, честно.
Вот чтобы этого не было, придумали inline. Суть проще пареной репы: ты пишешь это слово перед функцией, и компилятор, вместо того чтобы оставлять вызов, тупо вставляет её тело прямо в то место, где ты её вызвал. Как будто ты сам там этот код написал. Никаких прыжков туда-сюда.
Вот смотри, классический пример — замер времени выполнения какого-то блока кода. Без инлайна это была бы просто функция, принимающая лямбду. Но с ним — красота!
inline fun measureTime(block: () -> Unit) {
val start = System.currentTimeMillis()
block()
println("Time: ${System.currentTimeMillis() - start}ms")
}
И когда ты её используешь, компилятор делает волшебство. Вместо вызова measureTime { myHeavyCode() }, он на этапе компиляции разворачивает это всё в:
val start = System.currentTimeMillis()
myHeavyCode()
println("Time: ${System.currentTimeMillis() - start}ms")
Видишь? Вообще хуй с горы, никакой лишней функции. Всё прямо на месте. Особенно это, блядь, кайфово для этих самых функций высшего порядка — filter, map, forEach. Там же под капотом лямбды создаются, объекты... А с inline этого всего нет, просто код подставляется. Производительность, ядрёна вошь, растёт!
И ещё один прикол — non-local returns. Обычно из лямбды ты не можешь просто так return из внешней функции. Ты как бы внутри вложенного блока. А с inline — запросто! Потому что лямбда-то инлайнится, и return становится самым обычным return прямо в твоём коде. Удобно, сука.
Но, чувак, есть же и подводные камни, ёб твою мать!
Не надо вешать inline на всё подряд. Если функция большая, рекурсивная или её вызывают всего пару раз — это пиздец как невыгодно. Потому что размер твоего скомпилированного кода (билда) раздуется, как жопа после новогодних праздников. Компилятор будет тупо копировать одно и то же тело функции в кучу мест. Терпения ноль ебать у того, кто потом этот раздутый артефакт будет качать.
Итог простой, как три копейки: используй inline осознанно. Только там, где реально есть проблемы с производительностью из-за частых вызовов мелких функций, особенно с лямбдами. Во всех остальных случаях — да похуй, пусть работает как обычная функция. Не надо из пушки по воробьям, а то сам потом охуеешь от размера апки.