0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Функции как значения

Функции первого класса

«Функции как значения» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Функции как значения
  2. Каррирование
  3. Композиция
  4. Замыкания
← Назад к Scala for Backend Engineering & Functional Programming