Встраивание тела в 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" и выведите ее дважды.