Функции как значения
Функции первого класса
«Функции как значения» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Функции — это значения
В Scala функции являются объектами первого класса. Вы можете сохранять их в переменных, передавать как аргументы и возвращать из других функций — так же, как числа или строки.
object Main {
def main(args: Array[String]): Unit = {
val increment: Int => Int = x => x + 1
println(increment(5))
}
}Синтаксис типа функции
Тип Int => String означает функцию, принимающую Int и возвращающую String. Для нескольких параметров используются круглые скобки: (Int, Int) => Int.
object Main {
def main(args: Array[String]): Unit = {
val add: (Int, Int) => Int = (a, b) => a + b
val label: Int => String = n => s"value=$n"
println(add(3, 4))
println(label(7))
}
}Синтаксис лямбды (анонимной функции)
Анонимная функция, или лямбда, записывается как (params) => body. У неё нет имени, и её часто напрямую передают другой функции.
object Main {
def main(args: Array[String]): Unit = {
val square = (x: Int) => x * x
println(square(6))
}
}Функции высшего порядка
Функция высшего порядка принимает функцию в качестве параметра или возвращает функцию. Классические примеры — map и filter.
object Main {
def applyTwice(f: Int => Int, x: Int): Int = f(f(x))
def main(args: Array[String]): Unit = {
println(applyTwice(_ + 3, 10))
}
}Передача функций методам
Методы коллекций принимают функции. Вы можете передать лямбду непосредственно или передать именованное значение функции.
object Main {
def main(args: Array[String]): Unit = {
val triple = (x: Int) => x * 3
println(List(1, 2, 3).map(triple))
println(List(1, 2, 3).map(x => x * 3))
}
}Возврат функций
Функция может возвращать другую функцию. Здесь multiplier возвращает функцию, умножающую значение на фиксированный множитель, то есть представляет собой небольшую фабрику функций.
object Main {
def multiplier(factor: Int): Int => Int = x => x * factor
def main(args: Array[String]): Unit = {
val timesTen = multiplier(10)
println(timesTen(5))
}
}Методы и функции
def определяет метод. Вы можете преобразовать метод в значение функции с помощью подчёркивания при эта-расширении: methodName _, либо просто использовать метод там, где ожидается функция.
object Main {
def doubleIt(x: Int): Int = x * 2
def main(args: Array[String]): Unit = {
val f: Int => Int = doubleIt
println(f(8))
println(List(1, 2, 3).map(doubleIt))
}
}Функции без параметров
Функция может не принимать аргументов. Её тип записывается как () => T. Это удобно для отложенного вычисления.
object Main {
def main(args: Array[String]): Unit = {
val greeting: () => String = () => "Hello!"
println(greeting())
}
}Хранение функций в коллекциях
Поскольку функции являются значениями, вы можете хранить их в списках или отображениях и динамически находить нужную функцию, создавая небольшой диспетчер команд.
object Main {
def main(args: Array[String]): Unit = {
val ops: Map[String, (Int, Int) => Int] = Map(
"add" -> (_ + _),
"mul" -> (_ * _)
)
println(ops("add")(3, 4))
println(ops("mul")(3, 4))
}
}Функции как конфигурация
Передача функции позволяет вызывающему коду настраивать поведение. Здесь универсальная функция transformAll применяет любую функцию ко всем элементам списка.
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), _ + 100))
println(transformAll(List(1, 2, 3), _ * 10))
}
}Более понятный пример настройки
Вот та же идея в более аккуратной записи: вызывающий код предоставляет преобразование, поэтому вспомогательная функция остаётся универсальной и пригодной для повторного использования.
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), x => x + 100))
println(transformAll(List(1, 2, 3), x => x * x))
}
}Быстрая проверка
Что такое функция высшего порядка?
Повторение
Вы узнали, что функции являются значениями первого класса:
- Храните функции в
val, списках и отображениях - Типы функций, например
Int => String - Лямбды:
(x) => bodyи сокращённая запись с_ - Функции высшего порядка принимают функции или возвращают их
- Методы становятся значениями функций посредством эта-расширения
Часто задаваемые вопросы
Урок «Функции как значения» бесплатный?
Да — полный текст урока «Функции как значения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «Функции как значения»?
Функции первого класса Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Функции как значения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Функции как значения
- Каррирование
- Композиция
- Замыкания