На этом шаге мы рассмотрим передачу лямбды через сокращенный вызов анонимной функции.
Когда функция принимает другую функцию в последнем параметре, круглые скобки вокруг аргумента с лямбдой можно отбросить. То есть пример, рассмотренный ранее:
"Mississippi".count({ it == 's' })
"Mississippi".count{ it == 's' }
Такой синтаксис проще читать, и он лучше передает суть вашей функции.
Сокращенный синтаксис можно использовать, только когда лямбда передается в функцию как последний аргумент. Когда вы будете писать свои функции, объявляйте параметры функционального типа последними, чтобы при обращении к вашей функции можно было воспользоваться преимуществами этой схемы.
В SimVillage сокращенный синтаксис вызова можно применить к нашей функции runSimulation(). Эта функция ожидает два аргумента: строку и функцию. Передайте функции runSimulation() аргументы, которые не являются функциями, в круглых скобках. Затем допишите последний аргумент функции вне скобок.
fun main() { runSimulation("Guyal") { playerName, numBuildings -> val currentYear = 2021 println("Adding $numBuildings houses") "Welcome to SimVillage, $playerName! (copyright $currentYear)" } } fun runSimulation(playerName: String, greetingFunction: (String, Int) -> String) { val numBuildings = (1..3).shuffled().last() // Случайно выберет 1, 2 или 3 println(greetingFunction(playerName, numBuildings)) }
Рис.1. Передача лямбды через сокращенный синтаксис (SimVillage.kt)
Ничего не поменялось в реализации функции runSimulation(); все изменения коснулись только ее вызова. Обратите внимание: так как теперь вы не присваиваете лямбду переменной, а напрямую передаете ее runSimulation(), указывать типы параметров в лямбде больше не требуется.
Сокращенный синтаксис позволяет писать более чистый код, и мы будем применять его далее везде, где это возможно.
На следующем шаге мы рассмотрим встроенные функции.