Урок 9. Функции. Часть 2

Урок 9. Функции. Часть 2

E-code
Если что-то не работает, нужно просто перезагрузить. Типичный программист


Анонимность в интернете имеет для человека конкретный смысл. Кто-то просто стесняется показать себя, кому-то нравится быть троллем и портить жизнь остальным пользователям. Для функций тоже есть своя анонимность, благо она работает на программиста. Анонимные функции. Их-то мы и рассмотрим.


Анонимные функции

Следуем названию. Анонимные функции не имеют имени в объявлении функции. Основа их применения состоит в том, что они либо являются аргументами при передаче, либо возвращаются из других функций.

Анонимные функции = лямбда-выражения = лямбды. Это всё одно и тоже, но в статье я буду продолжать "анонимные функции", чтобы не вызывать путаницу.


Рассмотрим пример. Данные функции могут адаптировать функции из стандартной библиотеки Kotlin. Функция count делает подсчёт символов в строке и возвращает их.

Снова учимся считать


Модифицируем нашу функцию, чтобы она считала определённые символы, например, "o".

На подчёркивания пока не смотрим

Что мы сделали? Мы использовали анонимную функцию (в фигурных скобках) чтобы определить какие символы должны подсчитываться стандартной функцией count. Проверяются все символы, но счётчик увеличивается , когда проверяемый символ удовлетворяет условию.


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

Следите за скобочками

Анонимная функция объявила переменную и вернула строку, которую выведет println.

Вывод:

Да, так меня зовут


Функциональные типы

Функциональные типы - типы анонимных функций

Благодаря функциональным типам мы можем создать анонимную функцию внутри простой переменной. Их нахождение в коде аналогично обычным переменным. Не волнуйтесь, сейчас мы во всём разберёмся. Снова сделаем приветствие.

Обратите внимание на скобки вывода


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

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

Таким образом, helloFunction мы можем присвоить любую функцию без параметров с возвратом String. Это мы и сделали, присвоив анонимную функцию, возвращающую строку.


Неявный возврат

Немного текста. Обычные функции требуют возврат значения с ключевым словом return, а анонимные - нет. Почему? Фишка анонимных функций. Они возвращают последний результат выполнения в теле функции. Это упрощает синтаксис, кроме того позволяет избежать неясности в коде как для человека, так и для компилятора.

Когда представил, если бы ещё и анонимные функции требовали return


Функциональные аргументы

Никакой дискриминации. Анонимные функции тоже могут принимать аргументы!

Ваша секретарша тоже говорит температуру внутри помещения? Мне вот приходилось...


Анонимная функция принимает число, при этом имя числового параметра указывается внутри самой функции. По синтаксису мы должны указать имя и поставить ->.

Вывод:

... теперь отыгрываюсь на других


Ключевое слово it

Если с воображением туго и в анонимной функции лишь 1 аргумент, можно смело использовать ключевое слово it.

Чем меньше код, тем лучше. Ведь так?

Данная возможность хорошо подходит для небольших и простых по смыслу функций. Со встроенными функциями всё ещё красивее, вспомним count.


Да, лучше


Получение нескольких аргументов

Нам нужно больше аргументов. Я так хочу (чтобы лето не кончалось). Пусть секретарь будет говорить и день недели. Вдруг у нас запой.

Ну почему понедельник?(


Стоит помнить, что в последней инструкции мы должны вернуть строку. Вывод:

Самые страшные слова


Поддержка автоматического определения типов

Откатимся немного назад .Из примера ниже видно, что указание типа необязательно.

Нигде типов нет


Можно увидеть эту поддержку в функциях, где есть один и более аргумент. Только нужно обязательно указать имя и тип параметра в самой функции.

Тип функции определится автоматически


Функция с функцией в аргументах

Настало время тяжёлой артиллерии. Анонимная функция может находится в параметрах другой функции.

Слишком большое приветствие


fullHelloFunction принимает во втором параметре анонимную функцию и спокойно с ней взаимодействует.

Опытные программисты используют другой способ написания таких функций. Можно и нужно использовать сокращённый синтаксис, когда анонимная функция идёт последним параметром напрямую

Вывод будет аналогичен предыдущему

Кроме того, в самой функции больше не нужно указывать типы параметров, потому что у нас нету больше переменной.


Встроенные функции

Анонимные функции дают воображению разогнаться. Вот только их производительность оставляет желать лучшего. Можно увеличить производительность такой функции путём встраивания. Пока что мы не будем касаться подробностей, поскольку это связано с JVM (java virtual machine).

Так быстрее


Одним словом мы увеличили производительность. Стоит понимать, что встраивание не всегда возможно. При рекурсии мы получим бесконечный цикл, если применим inline для анонимной функции.


Ссылка на функцию

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

Значение функции стало аргументом


Лямбды - замыкания

Они могут использовать и изменять переменные вне их области видимости.

Вызовем функцию дважды

Посмотрим на вывод:

Растёт на дрожжах


Когда прочёл статью об анонимных функциях



Что дальше?

Мы рассмотрели анонимные функции, функциональные типы и их возможности. Следующая тема останется тайной, пока не выйдет следующая статья.


Дорогой читатель, надеюсь моя статья оказалась полезной для тебя!

Ты всегда можешь следить за нашим творчеством на этом канале.

Спасибо за проявленный интерес!



Report Page