Шаг 54.
Основы Kotlin. Анонимные функции и функциональные типы. Объявление функции, которая принимает функцию

    На этом шаге мы рассмотрим реализацию такой функции.

    Вы уже видели: анонимные функции могут менять поведение функций из стандартной библиотеки. Их также можно использовать для настройки поведения ваших собственных функций.

    Кстати, с этого момента мы будем называть анонимные функции лямбдами, а их экземпляры - лямбда-выражениями. Результаты, возвращаемые анонимными функциями, будем называть результатом лямбды. Это распространенная терминология.


Банальный вопрос: почему "лямбда"? Этот термин, также обозначаемый греческой буквой λ, является сокращенной формой названия "лямбда-исчисление" - системы логики для выражения вычислений, разработанной в 1930 году математиком Алонзо Черчем (Alonzo Church). Определяя анонимные функции, вы используете нотацию лямбда-исчислений.

    Параметр функции может принимать аргументы любого типа, даже аргументы, которые сами представляют функции. Параметр функционального типа объявляется, как и параметр любого другого типа, - в круглых скобках после имени функции - с указанием соответствующего типа. Чтобы увидеть, как это работает, добавьте новую функцию в SimVillage, которая будет выбирать случайное число построенных зданий и вызывать лямбду для вывода приветствия.

    Добавьте функцию с именем runSimulation(), которая принимает переменные playerName и greetFunction. Также воспользуйтесь парой функций из стандартной библиотеки для получения случайного числа. В конце вызовите функцию runSimulation.

fun main() {
    val greetingFunction = { playerName: String, numBuildings: Int ->
        val currentYear = 2021
        println("Adding $numBuildings houses")
        "Welcome to SimVillage, $playerName! (copyright $currentYear)"
    }
   runSimulation("Guyal", greetingFunction))
}

fun runSimulation(playerName: String, greetingFunction: (String, Int) -> String) {
        val numBuildings = (1..3).shuffled().last() // Случайно выберет 1, 2 или 3
        println(greetingFunction(playerName, numBuildings))
}
Файл с проектом можно взять здесь.


Рис.1. Добавление функции runSimulation (SimVillage.kt)

    Функция runSimulatin() принимает два параметра: playerName и greetFunction, функцию, которая принимает String и Int и возвращает String. Фугкция runSimulation() генерирует случайное число и вызывает функцию, переданную в greetFunction со случайным числом и значением playerName (которое runSimulation() получает как аргумент).

    Запустите SimVillage несколько раз.


Рис.2. Результат работы приложения

    Вы увидите, что количество построенных зданий каждый раз разное, потому что runSimulation() каждый раз генерирует новое случайное число для функции приветствия.

    На следующем шаге мы рассмотрим сокращенный синтаксис.




Предыдущий шаг Содержание Следующий шаг