Когда нужно использовать ключевое слово inline с лямбдами в Kotlin

Ответ

inline используется для лямбд, чтобы избежать накладных расходов на создание анонимных классов при каждом вызове. Это особенно полезно для высокоуровневых функций (например, map, filter), где лямбды вызываются часто.

Пример:

inline fun performOperation(action: () -> Unit) {
    action()
}

// При компиляции код "встраивается", избегая создания объекта Function
performOperation { println("Inline lambda") }

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

  • Для больших лямбд (увеличивает размер бинарника).
  • Если лямбда передаётся в другую функцию без inline (например, в Java-метод).
  • Для рекурсивных лямбд (невозможно встроить).

Оптимально для коротких лямбд в performance-critical коде.

Ответ 18+ 🔞

А, ну это про inline для лямбд! Слушай, тут история про то, как не тратить ресурсы попусту, как будто на дворе 2002-й год и каждый байт на счету.

Представь, ты пишешь какую-нибудь высокоуровневую функцию, типа map или filter. Ты туда лямбду суёшь — красота, код читается легко. Но компилятор-то под капотом для каждой такой лямбды создаёт анонимный класс, объект этого класса. И если ты эту штуку вызываешь в цикле миллион раз, то получается овердохуища этих одноразовых объектов. Мусорщик потом офигевает, производительность проседает — в общем, пиздопроебибна.

Вот чтобы этого не было, и придумали модификатор inline. Ты его ставишь перед fun, и он как бы говорит компилятору: «Чувак, не создавай тут лишнюю сущность, а просто возьми код из лямбды и вставь его прямо на место вызова, как будто я его там написал».

Пример, чтобы было понятно:

inline fun performOperation(action: () -> Unit) {
    action()
}

// Вызываем
performOperation { println("Inline lambda") }

После компиляции это превращается примерно в такую простыню:

// Вместо вызова функции создаётся прямой код
println("Inline lambda")

Видишь? Никакого лишнего объекта action. Просто выполнилось и всё. Волнение ебать — экономия!

Но есть же и подводные камни, хитрая жопа!

Когда НЕ надо использовать inline:

  1. Если лямбда большая. Ты же не хочешь, чтобы твой скомпилированный код раздулся до неприличных размеров? Встраивать целую простыню текста в десятке мест — терпения ноль ебать у того, кто будет это читать в байткоде.
  2. Если ты эту лямбду куда-то передаёшь дальше, например, в какую-нибудь Java-библиотеку или в функцию без inline. Там её уже не встроишь, смысла нет.
  3. Для рекурсивных лямбд. Это вообще технически невозможно, компилятор посмотрит на тебя и скажет: «Чёрта в душу, в сердцу мать! Ты как себе это представляешь?».

Так что правило простое: inline — это для коротких, быстрых лямбд, особенно в тех местах, где каждый микропроцессорный такт на вес золота. Для всего остального — доверия ебать ноль, лучше без него.