6. Начните работу с лямбда-выражениями и функциями высшего порядка

В этом задании вы познакомитесь с лямбда-выражениями и функциями высшего порядка в Kotlin.

В дополнение к традиционным именованным функциям, Kotlin поддерживает лямбда-выражения, аналогичные Java. Лямбда — это выражение, описывающее функцию. Но вместо объявления именованной функции вы объявляете функцию, которая не имеет имени. Полезность этого подхода заключается в том, что лямбда-выражение теперь можно передавать в качестве данных. В других языках лямбда-выражения называются анонимными функциями , функциональными литералами или подобными именами.

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

Воспользуйтесь интерактивной консолью (REPL) ( Инструменты > Kotlin > Kotlin REPL ) и попробуйте выполнить следующий код:

var dirtyLevel = 20
val waterFilter = { dirty : Int -> dirty / 2}
println(waterFilter(dirtyLevel))
⇒ 10

В этом примере лямбда-функция принимает Intименованный объект dirtyи возвращает dirty / 2. ()

  1. Синтаксис Kotlin для типов функций тесно связан с синтаксисом для лямбда-выражений. Используйте этот синтаксис для корректного объявления переменной, содержащей функцию:
val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }

Вот что написано в коде:

  • Создайте переменную с именем waterFilter.
  • waterFilterЭто может быть любая функция, которая принимает значение Intи возвращает значение Int.
  • Присвойте лямбда-функцию переменной waterFilter.
  • Функция лямбда возвращает значение аргумента, dirtyделенное на 2.

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

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

Функция высшего порядка — это функция, которая принимает другие функции в качестве параметров, или функция, которая возвращает другую функцию. Вы можете передать лямбда-выражение функции высшего порядка, которая принимает функцию в качестве аргумента. В предыдущем задании вы создали функцию высшего порядка с именем filter. В качестве условия для проверки функции filter вы передали следующее лямбда-выражение:

{ it[0] == 'p' }

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

  1. Напишите функцию высшего порядка. Вот простой пример: функция, принимающая два аргумента. Первый аргумент — целое число. Второй аргумент — функция, которая принимает целое число и возвращает целое число. Попробуйте её в REPL.
fun updateDirty(dirty: Int, operation: (Int) -> Int): Int {
   return operation(dirty)
}

В теле кода вызывается функция, переданная в качестве второго аргумента, и ей передается первый аргумент.

  1. Чтобы вызвать эту функцию, передайте ей целое число и саму функцию.
val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }
println(updateDirty(30, waterFilter))
⇒ 15

Передаваемая функция не обязательно должна быть лямбда-функцией; это может быть обычная именованная функция. Чтобы указать аргумент как обычную функцию, используйте оператор ::`require`. Таким образом, Kotlin будет знать, что вы передаете ссылку на функцию в качестве аргумента, а не пытаетесь вызвать саму функцию.

  1. Попробуйте передать обычную именованную функцию в updateDirty().
fun increaseDirty( start: Int ) = start + 1

println(updateDirty(15, ::increaseDirty))
⇒ 16
var dirtyLevel = 19
dirtyLevel = updateDirty(dirtyLevel) { dirtyLevel -> dirtyLevel + 23}
println(dirtyLevel)
⇒ 42

Last modified: Sunday, 5 April 2026, 12:30 PM