Demystifying the inline keyword — статья, посвященная ключевому слову inline, которое подсказывает компилятору, что вместо вызова функции он должен встраивать ее тело в то место, где происходит вызов.
Рекомендуем: Полезные советы по Kotlin
Inline-функции появились в Kotlin по причине избыточности местной реализации лямбд. Каждый раз, когда вызывается функция, которая принимает лямбду в качестве аргумента, виртуальной машине приходится создавать анонимный объект для хранения этой функции. А так как это затратная в плане ресурсов операция, разработчики Koltin придумали решение: если объявить функцию с ключевым словом inline, то компилятор «развернет» эту функцию и ее лямбду в последовательный код.
Правило простое: если ваш код множество раз вызывает функцию, принимающую лямбду в качестве аргумента, лучше сделать ее inline-функцией. Также запомните следующие вещи:
- Kotlin 1.1 позволяет применять ключевое слово inline также к полям, в которых используются геттеры и сеттеры;
- ключевое слово return, вызванное из лямбды, переданной inline-функции, будет возвращать не из лямбды или inline-функции, а из функции, вызвавшей inline-функцию;
- кроме ключевого слова inline, также существуют noinline и crossinline. Первое можно использовать в отношении отдельно взятых лямбд, когда inline-функция принимает несколько лямбд. Второе пригодится в случае, когда лямбда должна быть выполнена в другом контексте исполнения. Пример:
12345inline fun exampleFun(crossinline body: () → Unit) {Runnable {body()}.run()}