Для начала, в Kotlin функции являются первоклассными типами, такими же, как числа, строки и прочее.Таким образом, функция может принимать другую функцию в качестве параметра и / или возвращать функцию в качестве результата.Функция, которая делает это, называется «функцией высшего порядка».
И это то, что вы имеете в своем примере!Строка:
fun myHigherOrderFun(functionArg: (Int)->String) = functionArg(5)
определяет myHigherOrderFun()
как функцию, которая принимает один параметр, которая сама является функцией, принимающей один параметр Int
и возвращающей String
.(myHigherOrderFun()
не указывает явный тип возвращаемого значения, поэтому предполагается, что он также String
.)
Вероятно, следующая строка будет менее ясной:
println(myHigherOrderFun{ "The Number is $it" })
Первая неочевидная вещь заключается в том, что он вызывает myHigherOrderFun()
с параметром.Поскольку этот параметр является лямбда-выражением, Kotlin позволяет вам опустить обычный (
… )
и использовать только фигурные скобки.
Другая неочевидная вещь - это сама лямбда: { "The Number is $it" }
.Это буквенная функция, принимающая один параметр (неопределенного типа).
Обычно вам нужно явно указывать любые параметры, например: { a: Char, b: Int -> /* … */ }
.Но если есть ровно один параметр, и вы не указываете его тип, вы можете пропустить его и просто обратиться к параметру как it
.Вот что здесь происходит.
(Если бы лямбда не ссылалась на it
, то это была бы функция, не принимающая никаких параметров вообще.)
И поскольку лямбда передается вчто-то ожидающее функцию, принимающую параметр Int
, Котлин знает, что it
должно быть Int
, поэтому мы можем обойтись без указания этого.
Итак, Котлин передает эту лямбду в myHigherOrderFun()
, который выполняет лямбду, передавая 5
как it
.Это интерполирует его в строку, которую он возвращает в качестве аргумента println()
.
Многие лямбда-выражения принимают один параметр, поэтому it
довольно часто используется в Kotlin;это более кратко (и обычно более читабельно), чем альтернатива.См. документы для получения дополнительной информации.