Шаг 47.
Основы Kotlin.
Анонимные функции и функциональные типы. Анонимные функции

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

    Анонимные функции - важная часть языка Kotlin. Одно из их применений - адаптация функций из стандартной библиотеки Kotlin для решения конкретных задач. Анонимная функция позволит вам добавить правила для функций из стандартной библиотеки и настроить их поведение. Рассмотрим пример.

    Одна из многих функций стандартной библиотеки - это count(). Вызванная со строкой функция count() возвращает количество символов в строке. Код ниже считает количество букв в строке "Mississippi":

  val numLetters = "Mississippi".count() 
  print(numLetters) // Выведет 11


Здесь был использован точечный синтаксис вызова функции count(). Этот синтаксис используется всегда, когда вызываемая функция является частью определения типа.

    А что если нужно посчитать только определенные символы в слове "Mississipi", например только 's'?

    Для решения такой задачи стандартная библиотека Kotlin позволяет добавить правила к функции count(), которые определят, какие символы должны быть подсчитаны. Вы задаете эти правила, передавая функции count аргумент с анонимной функцией. Это выглядит так:

  val numLetters = "Mississippi".count({ letter -> 
    letter == 's'
  })
  print(numLetters) // Выведет 4

    В этом примере функция count() использует анонимную функцию, чтобы решить, как считать символы в строке. Она последовательно передает анонимной функции символ за символом, и если та вернет истинное значение для некоторого символа, общий счет увеличивается на единицу. Как только будет проверен последний символ, функция count() возвращает итоговое значение.

    Анонимные функции позволяют стандартной библиотеке делать свою работу - предоставлять фундамент из функций и типов для построения превосходного приложения на языке Kotlin - без добавления возможностей, слишком специфических, чтобы называться "стандартными". У них есть и иные применения, которые будут рассмотрены далее.

    Чтобы понять, как count() работает, исследуем синтаксис анонимной функции языка Kotlin более подробно, объявив свою функцию. Мы напишем небольшую игру SimVillage, в которой вы будете играть роль мэра виртуальной деревни.

    Первая анонимная функция в Sim Village будет выводить приветствие для игрока, признавая его мэром деревни.


Зачем делать это с помощью анонимной функции? По мере изучения материала вы увидите, что это позволит вам легко передавать анонимную функцию в другие функции.

    Откройте проект Sandbox, создайте новый файл с именем SimVillage.kt и объявите функцию main(), как вы делали ранее (введите main и нажмите клавишу Tab).

    Объявите анонимную функцию внутри функции main(), вызовите ее и выведите результат.

  fun main() {
      println({
          val currentYear = 2021
          "Welcome to SimVillage, Mayor! (copyright $currentYear)"
      }())
  }
Файл с проектом можно взять здесь.


Рис.1. Объявление анонимной функции приветствия (SimVillage.kt)

    Так же как вы писали строку, вставляя символы между кавычками, напишите функцию, вставляя выражения или операторы между фигурными скобками. Начинаем с вызова функции println(). Внутри скобок, заключающих аргумент println(), вы добавляете пару фигурных скобок, в которых определяете тело анонимной функции. Анонимная функция объявляет переменную и возвращает строку с приветствием:

  {
    val currentYear = 2021
    "Welcome to SimVillage, Mayor! (copyright $currentYear)"
  }

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

  {
    val currentYear = 2021
    "Welcome to SimVillage, Mayor! (copyright $currentYear)"
  }()

    Запустите функцию main() SimVillage.kt. Появится следующий вывод:

  Welcome to SimVillage, Mayor! (copyright 2021)


Рис.2. Результат выполнения анонимной функции приветствия (SimVillage.kt)

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




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