Kotlin
Базовый Лямбдас
Поиск…
Синтаксис
Явные параметры:
{parameterName: ParameterType, otherParameterName: OtherParameterType -> anExpression ()}
Выведенные параметры:
val add: (Int, Int) -> Int = {a, b -> a + b}
Один параметр -
it
сокращенныйval square: (Int) -> Int = {it * it}
Подпись:
() -> ResultType
(InputType) -> ResultType
(InputType1, InputType2) -> ResultType
замечания
Параметры типа ввода могут быть опущены, когда их можно оставить без внимания, когда они могут быть выведены из контекста. Например, скажем, что у вас есть функция класса, который выполняет функцию:
data class User(val fistName: String, val lastName: String) {
fun username(userNameGenerator: (String, String) -> String) =
userNameGenerator(firstName, secondName)
}
Вы можете использовать эту функцию, передав лямбда, и поскольку параметры уже указаны в сигнатуре функции, нет необходимости повторно объявлять их в выражении лямбда:
val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
"${firstName.toUppercase}"_"${secondName.toUppercase}"
}) // prints FOO_BAR
Это также применяется, когда вы назначаете лямбда переменной:
//valid:
val addition: (Int, Int) = { a, b -> a + b }
//valid:
val addition = { a: Int, b: Int -> a + b }
//error (type inference failure):
val addition = { a, b -> a + b }
Когда лямбда принимает один параметр, и тип может быть выведен из контекста, вы можете обратиться к параметру с помощью it
.
listOf(1,2,3).map { it * 2 } // [2,4,6]
Лямбда как параметр для функции фильтрации
val allowedUsers = users.filter { it.age > MINIMUM_AGE }
Лямбда передавалась как переменная
val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)
Лямбда для сравнения вызова функции
Секундомер общего назначения для определения времени выполнения функции для запуска:
object Benchmark {
fun realtime(body: () -> Unit): Duration {
val start = Instant.now()
try {
body()
} finally {
val end = Instant.now()
return Duration.between(start, end)
}
}
}
Использование:
val time = Benchmark.realtime({
// some long-running code goes here ...
})
println("Executed the code in $time")