Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpIlBd 112 of 299 menu
◀ ▶

Встраивание тела в Kotlin

Параметр типа «функция без аргументов» в Kotlin обычно превращается в объект с методом invoke. Без встраивания такой объект создается на каждый вызов, если лямбду передают снаружи.

Функция ниже просто выполняет переданный блок. Лямбда здесь - отдельное значение, которое вызывают изнутри:

fun once(block: () -> Unit) { block() } fun main() { once { println("step") } }

Компилятор строит объект под лямбду и передает его в once. Для коротких блоков это лишняя работа: без встраивания лямбда - отдельный объект, а не строки кода прямо в main.

Имеет смысл встраивать небольшие функции, которые часто зовут с лямбдами: так уменьшается число временных объектов. Крупные тела раздувают каждую точку вызова, поэтому пометку ставят там, где выигрыш очевиден.

Тот же смысл с пометкой inline у функции ведет себя иначе: тело функции и содержимое лямбды оказываются в месте вызова, отдельный объект для блока не нужен:

inline fun onceInline(block: () -> Unit) { block() } fun main() { onceInline { println("step") } }

Объявите функцию с одним параметром-лямбдой, которая два раза подряд вызывает переданный блок. В main передайте лямбду с одной строкой "tick" и убедитесь, что она печатается дважды.

Объявите вторую функцию, которая тоже дважды выполняет блок, но ее тело и лямбда подставляются в место вызова. Передайте блок со строкой "tick" и выведите ее дважды.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить