Шаг 55.
Основы Kotlin.
Анонимные функции и функциональные типы. Сокращенный синтаксис

    На этом шаге мы рассмотрим передачу лямбды через сокращенный вызов анонимной функции.

    Когда функция принимает другую функцию в последнем параметре, круглые скобки вокруг аргумента с лямбдой можно отбросить. То есть пример, рассмотренный ранее:

  "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(), указывать типы параметров в лямбде больше не требуется.

    Сокращенный синтаксис позволяет писать более чистый код, и мы будем применять его далее везде, где это возможно.

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




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